Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
数值类型的C++模板_C++_Templates_C++11 - Fatal编程技术网

数值类型的C++模板

数值类型的C++模板,c++,templates,c++11,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

我想有一个模板来选择数字类型,但我也希望有一个全局类型模板。我试图将解决方案应用于问题,但没有成功:

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 */ }
因为现在我有两个具有相同标题的函数。做以下事情的正确方法是什么:

template<typename T, typename ... Types>
void myFct(T arg1, Types ... rest) 
{ 
    if (isNumeric(T))
        doNumericStuff();
    else
        doStuff();
}

可能有更好的方法可以做到这一点,但对我来说最简单的方法就是将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*/ }

当你有两个以上的互斥选项时,这会变得非常笨拙,但这肯定会起作用

您可以在这里使用标记分派,并重载实现功能,因为您的do工作似乎一次只涉及一个对象

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
}

您是否尝试过反转enable_if的条件并将其放入第一个模板(用于通用Ts的模板)中?它的解决方案比标记分派更糟糕,但它是一个解决方案。是的,我尝试了,我得到了错误代码C2995函数模板已经定义,因为myFctT,类型有2个定义。谢谢,这正是我想要的。我只是不知道typename作为返回类型是如何工作的。。。我去看看,这是个好主意。将记住那些正确的类型和错误的类型。也许有一天会有用的=D来自标记分派的错误消息也比来自SFINAE的错误消息不那么疯狂
number
not-number
number