考虑以下示例。

#include <type_traits>
#include <iostream>
using namespace std;

template <typename T_>
using Integral = typename std::enable_if<std::is_integral<T_>::value,T_>::type;
template <typename T_>
using NotIntegral = typename std::enable_if<!std::is_integral<T_>::value, T_>::type;

template <typename T_>
void printIt(const Integral<T_> &value) { cout << "Integral == " << value << endl; }

template <typename T_>
void printIt(const NotIntegral<T_> &value) { cout << "Non Integral == " << value << endl; }

template <typename T_>
void foo(const T_ &value) { printIt<T_>(value); }

int main(int argc, char** argv)
{
    printIt<int>(66);   //Must explicitly provide argument type.
    //printIt(33);        //Compiler error. No overloaded function....????
    foo(29.);

    return 0;
}

为什么需要显式设置模板参数的类型?编译器是否应该确定它是 int 类型参数?

最佳答案



因为这些是 non-deduced contexts

想象一下专门化 std::enable_if<std::is_integral<T_>::value,T_> 以便 ::type 评估其他内容。编译器无法知道从 typename something<T>::typeT 的映射。

你可以通过将 std::enable_if 作为返回类型的一部分来实现你想要的结果,这样不匹配的重载就会被 SFINAEd 掉:

template <typename T>
auto printIt(T x) -> std::enable_if_t<std::is_integral_v<T>, void> { /*...*/ }

template <typename T>
auto printIt(T x) -> std::enable_if_t<!std::is_integral_v<T>, void> { /*...*/ }

live wandbox example

关于c++ - 模板类型推导失败?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46151662/

10-11 23:08
查看更多