如何实例化并使用C++模板结构体中定义的operator()模板方法?
启用与访问模板方法
咱们先拆解问题:你这段代码里的operator()模板写法有个小问题,导致没法正常调用,先把问题修正,再看怎么实例化使用。
原代码的问题点
结构体S里的operator()模板参数写法不对:
template<typename U,typename enable_if<is_same<T,U>::value>::type> void operator()(U&& rrU){t = rrU;}
这里第二个模板参数只指定了类型,既没有参数名,也没有默认值,编译器没法推导这个参数的类型,自然没法正常实例化这个模板方法。
修正后的代码与调用方式
我们需要把enable_if改成模板参数的默认类型(或者放在返回值位置),让SFINAE(替换失败不是错误)机制正常工作。下面是两种可行的修正方案:
方案1:将enable_if作为模板默认参数
#include<iostream> #include<cstdlib> #include<type_traits> using std::enable_if; using std::is_same; using std::cout; using std::endl; template<typename T> struct S{ S(){t = static_cast<T>(NULL);} // 修正:给enable_if的type加上默认参数 template<typename U, typename = typename enable_if<is_same<T,U>::value>::type> void operator()(U&& rrU){t = rrU;} T t; }; int main(){ S<int> s; // 调用方式1:传入右值 s(123); cout << "当前t的值:" << s.t << endl; // 输出123 // 调用方式2:传入左值 int num = 456; s(num); cout << "当前t的值:" << s.t << endl; // 输出456 // 尝试传入非int类型会编译失败(符合预期,因为enable_if过滤了这种情况) // s(3.14); // 取消注释会报错,因为U=double和T=int类型不同 return 0; }
方案2:将enable_if放在返回值位置
如果更喜欢这种写法,也可以把enable_if移到返回值处,效果完全一致:
template<typename T> struct S{ S(){t = static_cast<T>(NULL);} // 修正:把enable_if作为返回值的类型 template<typename U> typename enable_if<is_same<T,U>::value>::type operator()(U&& rrU){t = rrU;} T t; };
核心逻辑说明
这两种写法都是利用SFINAE机制:当U和T类型相同时,enable_if<is_same<T,U>::value>::type会解析为void,模板方法正常启用;当类型不同时,这个模板会因为替换失败被编译器忽略,从而达到只允许同类型参数调用的目的。
内容的提问来源于stack exchange,提问作者user9196120
相关产品推荐
相关产品推荐

