C++模板参数推导失败

omi*_*nns 1 c++ templates sfinae type-traits

为什么编译器可以使用以下代码推导出T:

#include <vector>

template<typename T>
void foo(T& t) {}

int main(void) {
    std::vector<uint8_t> vec = { 1,2,3 };
    foo(vec);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

但是这个代码失败了:

#include <vector>
#include <type_traits>

template<typename T>
void foo(typename std::enable_if<true, T>::type& t) {}

int main(void) {
    std::vector<uint8_t> vec = { 1,2,3 };
    foo(vec);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我想使用第二个构造,在两个模板函数之间进行选择,基于传递的类方法存在.

vso*_*tco 6

在第二种情况下,您有一个非推导的上下文,换句话说,编译器无法推断出类型.

非演绎语境的最简单的例子是

template<typename T>
struct Id
{
    using type = T;
};

template<typename T>
void foo(typename Id<T>::type arg); // T cannot be deduced
Run Code Online (Sandbox Code Playgroud)

  • 要解决这个问题,需要将用于演绎的上下文和enable_if分开.通常的做法是在函数返回值中使用enable_if,如下所示:`template <typename T> typename std :: enable_if <std :: is_same <T,std :: vector <uint8_t >> :: value,void> :: type foo(T&t){}` (2认同)