boost :: enable_if_c似乎不起作用

Jur*_*aho 6 c++ boost sfinae

可能重复:
如何使用enable_if根据类的模板参数启用成员函数

我有一个类模板:

template<typename T, size_t N> class Vector
Run Code Online (Sandbox Code Playgroud)

我想启用具体的构造函数N,所以我这样做:

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

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

error C2039: 'type' : is not a member of 'boost::enable_if_c<B,T>'
      with
      [
          B=false,
          T=float
      ]
Run Code Online (Sandbox Code Playgroud)

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

编辑: GCC也没有成功:http://ideone.com/7Ejo8

Luc*_*lle 5

您不能使用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
}
Run Code Online (Sandbox Code Playgroud)