Nor*_*hik 4 c++ templates c++11
我想要一个模板来选择数字类型,但我也希望也有一个全局类型模板.我试图为这个问题应用解决方案,但它不起作用:
template<typename T, typename ... Types>
void myFct(T arg1, Types ... rest) { /*do stuff*/ }
template<typename T, typename = typename std::enable_if<std::is_arithmetic<T>::value, T>::type,
typename ... Types>
void myFct(T arg1, Types ... rest) { /* do stuff */ }
Run Code Online (Sandbox Code Playgroud)
因为现在我有两个具有相同标题的函数.做什么的正确方法是:
template<typename T, typename ... Types>
void myFct(T arg1, Types ... rest)
{
if (isNumeric(T))
doNumericStuff();
else
doStuff();
}
Run Code Online (Sandbox Code Playgroud)
可能有更好的方法来做到这一点,但对我来说最简单的方法就是将其转换enable_if为返回类型:
template<typename T, typename ... Types>
typename std::enable_if<
std::is_arithmetic<T>::value
>::type
myFct(T arg1, Types ... rest) { /*do numeric stuff*/ }
template<typename T, typename ... Types>
typename std::enable_if<
!std::is_arithmetic<T>::value
>::type
myFct(T arg1, Types ... rest) { /*do non-numeric stuff*/ }
Run Code Online (Sandbox Code Playgroud)
一旦你拥有超过两个互斥的选项,这将变得非常笨拙,但这肯定会奏效.
您可以在这里使用标签分派,并重载实现函数,因为您的“do stuff”似乎一次只涉及一个对象。
template <typename T>
void do_stuff(T arg, std::true_type) {
std::cout << "number\n";
}
template <typename T>
void do_stuff(T arg, std::false_type) {
std::cout << "not-number\n";
}
void myFct() { }
template<typename T, typename... Ts>
void myFct(T arg1, Ts... rest) {
// is_arithmetic will derive either true_type or false_type
do_stuff(arg1, std::is_arithmetic<T>{});
myFct(rest...); // recurse
}
Run Code Online (Sandbox Code Playgroud)
这是获得“静态 if”之类的典型模式
如果我用它来调用它,myFct(1, std::string{}, 2.0);我会得到输出
number
not-number
number
Run Code Online (Sandbox Code Playgroud)