2017-03-27 158 views
0

这似乎是一个简单的类成员funrtion,但我有与std::enable_if如何禁用某些模板类型

语法的情况其实是很简单的一些困难。

模板类与模板参数,其将不对一种特定类型的T来实现T

2的功能。

两个函数没有参数或返回值的T

一个函数接受一个int,另一个函数返回一个int

任何简单的例子?

或者是否有另一个选项(C++ 11)不使用std::enable_if

回答

1

这很简单。只记得使用缺省类型/结构模板参数的另一个模板参数。

假设你想一类foo<T>有两个成员,void foo<T>::bar1 (int)int foo<T>::bar2()并假设你想要的bar1()bar2()实现只有Tlong不同。

你可以做如下

#include <type_traits> 

template <typename T> 
struct foo 
{ 
    template <typename U = T> 
    typename std::enable_if<false == std::is_same<U, long>::value>::type 
     bar1 (int) 
     { } 

    template <typename U = T> 
    typename std::enable_if<false == std::is_same<U, long>::value, int>::type 
     bar2() 
     { return 0; } 
}; 

int main() 
{ 
    foo<int> fi; 
    foo<long> fl; 

    fi.bar1(0); // compile 
    fi.bar2(); // compile 

    // fl.bar1(0); // compilation error 
    // fl.bar2(); // compilation error 
} 

有一种危险:有人可以绕过你的控制和明确的U类型如下

foo<long> fl; 

fl.bar1<long long>(0); 

为了避免这个问题,你可以提高你的std::enable_if测试如下

template <typename U = T> 
    typename std::enable_if 
     <sizeof(U) && (false == std::is_same<T, long>::value)>::type 
     bar1 (int) 
     { } 

    template <typename U = T> 
    typename std::enable_if 
     <sizeof(U) && (false == std::is_same<T, long>::value), int>::type 
     bar2() 
     { return 0; } 

如果你c一个使用C++编译器14,使用std::enable_if_t可避免一对夫妇的typename和一对夫妇如果::type和semplify代码如下

template <typename U = T> 
    std::enable_if_t<sizeof(U) && (false == std::is_same<T, long>::value)> 
     bar1 (int) 
     { } 

    template <typename U = T> 
    std::enable_if_t<sizeof(U) && (false == std::is_same<T, long>::value), int> 
     bar2() 
     { return 0; } 
+1

由于它完全没有whant我想要的。但我仍然缺乏一些理解。为什么不能直接使用'T'而不是'U'; ?第二个例子sizeof(U)怎么会得到0? – Waldorf