的boost :: enable_if_c似乎并没有工作

问题描述:

可能重复:
How to use enable_if to enable member functions based on template parameter of class的boost :: enable_if_c似乎并没有工作

我有一个类模板:

template<typename T, size_t N> class Vector 

我想启用特定构造N,所以我这样做:

Vector(typename boost::enable_if_c<N==2, T>::type const &e0, T const &e1) { 
    data[0] = e0; 
    data[1] = e1; 
} 

但编译器(MSVC 2010 SP1)给我一个错误,而不是应用SFINAE。错误是:

error C2039: 'type' : is not a member of 'boost::enable_if_c<B,T>' 
     with 
     [ 
      B=false, 
      T=float 
     ] 

什么问题?这是一个已知的问题吗?我该如何解决它?它是唯一使用static_assert的解决方案吗?

编辑: GCC不成功或者:http://ideone.com/7Ejo8

+0

你能发布ideone上的SSCE(并显示它在gcc上成功编译)吗? – 2012-03-27 14:17:58

+0

@ Ben Voigt:GCC也不编译它。 – 2012-03-27 14:27:16

+0

@Vlad Lazarenko:但在那里没有很好地描述如何解决它。 – 2012-03-27 14:35:21

不能使用enable_if允许/禁止基于类的模板参数的成员函数:enable_if只能在函数或类模板的应用。

就你而言,我能想到的唯一解决方案是专门化整个班级,使用enable_if或更简单的部分专业化。你可以把普通成员放在一个共同的基类中,以避免重复它们:

#include <cstdio> 

template<typename T, std::size_t N> 
struct VectorCommon 
{ 
    std::size_t size() { return N; } 
    void add(T const & element) { } 
}; 

template <typename T, std::size_t N> 
struct Vector : VectorCommon<T, N> 
{ 
}; 

template <typename T> 
struct Vector<T, 2> : VectorCommon<T, 2> 
{ 
    Vector(T const & e0, T const & e1) {} 
}; 

int main() 
{ 
    //Vector<int, 100> v100(12, 42); // compile error 

    Vector<char, 2> v2('a', 'b'); // ok 
}