我可以键入检查模板参数吗? (C++)[重复]
Posted
技术标签:
【中文标题】我可以键入检查模板参数吗? (C++)[重复]【英文标题】:Can I type check a template parameter? (C++) [duplicate] 【发布时间】:2021-01-19 08:56:31 【问题描述】:我想检查给定变量是否为字符。现在,我的函数根据向量的元素返回一个字符串。
问题是如果我给它一个 char 向量,那么 to_string() 会给我字符 'foo' 的数值。所以我希望它在哪里阅读:
a b
它改为读取
97 98
我宁愿在函数中实现一些东西而不是创建重载,因为我已经为参数类型 vector<vector<T>>
和 vector<array<T, 2>>
提供了另外两个重载,它们需要按相同的逻辑运行,总共有六个会很混乱功能而不是三个。
/** to string for vector that has singular elements
* vtos : vector to string
**/
template <class T>
basic_string<char> vtos (vector<T> &v )
string ret;
int i = 0;
for ( T& foo: v )
ret.append(to_string(foo) + " ");
if (++i % 10 ==0)
ret.push_back('\n');
return ret;
++++++++++++++++++++++++++++++++++++++
编辑: 如果您有 C++17,则可以使用标记的解决方案。我没有,所以我决定只使用默认参数。
编辑 2:标记的答案现在还包括一个编辑,在那里检查 c++17 之前的答案。我自己的也会留在这里。
template <class T>
basic_string<char> vtos (vector<T> &v, bool isChar=false)
string ret;
int i = 0;
for ( T& foo: v )
if (isChar)
ret.push_back(foo);
else
ret.append(to_string(foo));
ret.push_back(' ');
if (++i % 10 ==0)
ret.push_back('\n');
return ret;
【问题讨论】:
basic_string<char>
只是string
BTW。
if constexpr (std::is_same_v<T, char>) ...
?或者添加 my_to_string
并为 char
重载。
我没有安装 C++17,无法使用该解决方案。而是决定简单地添加一个默认的布尔参数 isChar,因为我只需要知道一个特定的情况。谢谢大家的回答
我已更新我的帖子以包含 c++14 解决方案。如果将is_same_v<>
替换为is_same<>::value
,它也可以在c++11 中使用
【参考方案1】:
您可以尝试使用if constexpr
和类型特征is_same
#include <iostream>
#include <type_traits>
#include <vector>
template <class T>
std::string vtos (const std::vector<T> &v )
std::string ret;
int i = 0;
auto to_string = [](const auto& elem)
if constexpr ( std::is_same_v<T,char> )
return std::string(1,elem);
else
return std::to_string(elem);
;
for (const T& foo: v )
ret.append(to_string(foo) + " ");
if (++i % 10 ==0) ret.push_back('\n');
return ret;
int main()
std::cout << vtos(std::vector<char>'a','b');
注意:
不要使用using namespace std;
。见this post。
如果不需要修改,请使用const &
而不是&
。看:
Const correctness
使用const &
,您可以匹配rvalue reference,就像在我的示例中一样。
C++14:您可以将if constexpr
替换为SFINAE
。 Demo
#include <iostream>
#include <type_traits>
#include <vector>
template <class T>
std::enable_if_t<std::is_same_v<T,char>, std::string> to_string(const T& elem)
return std::string(1,elem);
template <class T>
std::enable_if_t<not std::is_same_v<T,char>, std::string> to_string(const T& elem)
return std::to_string(elem);
template <class T>
std::string vtos (const std::vector<T> &v )
std::string ret;
int i = 0;
for (const T& foo: v )
ret.append(to_string(foo) + " ");
if (++i % 10 ==0) ret.push_back('\n');
return ret;
int main()
std::cout << vtos(std::vector<char>'a','b');
std::cout << vtos(std::vector<int>12,5);
编辑:Evg 更快,如果您发布答案,我将删除它
【讨论】:
以上是关于我可以键入检查模板参数吗? (C++)[重复]的主要内容,如果未能解决你的问题,请参考以下文章