我试图找到传递给模板的thee类的类型
template<typename ret>
ret copy(ret var){
if(ret == int){ //problematic line
cout << "int" << endl;
}
return var;
}
int main()
{
int a = 5;
auto b = copy(a);
cout << b << endl;
return 0;
}
但是它返回一个错误:
main.cpp: In function ‘ret copy(ret)’:
main.cpp:15:12: error: expected primary-expression before ‘==’ token
if(ret == int){
^~
main.cpp:15:15: error: expected primary-expression before ‘int’
if(ret == int){
^~~
main.cpp:15:15: error: expected ‘)’ before ‘int’
如何正确执行此操作?谢谢
与python不同,C ++int
不是类型的对象class
(或类似的东西)。您无法像那样进行比较。相反,您可以使用
template<typename ret>
ret copy(ret var)
{
if constexpr(std::is_same_v<ret, int>)
{
std::cout << "int\n";
}
// and so on....
编辑:(响应yaodav的评论)
请注意,if constexpr
仅C ++ 17支持。有其他选择,例如:
if (std::is_same<ret, int>::value)
{
std::cout << "int\n";
}
但是缺点是,如果需要做些更复杂的事情var
,例如var * 2
,则他们会得到ret
类型的语法错误std::vector<int>
。该if constexpr
语法不容易受到这种错误的,因为它不尝试在编译代码if constexpr
是假的(它只做它需要找到最后一个基本的解析}
。
如果需要较旧的C ++版本,则唯一可行的选择是重载:
void copy_helper(int var) {
std::cout << "int\n";
}
template <class T>
void copy_helper(const T&) {}
template<typename ret>
ret copy(ret var)
{
copy_helper(var);
还要注意(yaodav的另一条评论),即使用这种if
构造是不良设计的标志。通常,我更喜欢根据属性和功能而不是特定的类型来对事物进行条件处理(而我上面的重载示例条件太狭窄了)。例如,如果我需要一个整数类型(带有+,-,*,/等),那么我倾向于根据这些功能的存在来对代码进行条件化。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句