我正试图找到传递给模板的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’
如何正确执行此操作?谢谢
答案 0 :(得分:4)
与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
,那么对于{{1 }}。 ret
语法不易受此类错误的影响,因为当std::vector<int>
为假时,它不会尝试编译代码(它仅进行基本解析以查找最后一个if constexpr
如果需要较旧的C ++版本,则唯一可行的选择是重载:
if constexpr
还要注意(yaodav的另一条评论),使用这样的}
构造是不良设计的标志。总的来说,我更喜欢根据属性和功能而不是特定的类型来对事物进行条件处理(而我上面的重载示例条件太狭窄了)。例如,如果我需要一个整数类型(带有+,-,*,/等),那么我宁愿根据这些功能的存在来对代码进行条件处理。
答案 1 :(得分:2)
如评论中所述,像这样的显式类型检查通常是一个糟糕的设计。您可以阅读有关模板元编程和专业化的信息,以更好地解决您的问题。
如果可以使用运行时类型信息,则可以采用以下解决方法:
#include <iostream>
#include <typeinfo>
template<typename ret>
ret copy(ret var){
if(typeid(var) == typeid(int)){
std::cout << "int" << std::endl;
}
return var;
}
int main()
{
int a = 5;
auto b = copy(a);
std::cout << b << std::endl;
double c = 2.0;
auto d = copy(c);
std::cout << d << std::endl;
return 0;
}