2017-05-04 81 views
1

鉴于下面的代码,我想知道是否有可能为一组值创建专业化。在我的例子中,我想为N=3N=4创建一个专用,以使用已知大小的数组。在这种情况下是否有可能避免代码重复?如何为2个不同的值专门化模板?

template <typename T, unsigned int N> 
class A 
{ 
public: 
    T* data; 
}; 

template <typename T> 
class A<T, 3> 
{ 
public: 
    T data[3]; 
}; 

template <typename T> 
class A<T, 4> 
{ 
public: 
    T data[4]; 
}; 

int main() 
{ 
    A<int, 1> u; 
    std::cout << sizeof(u.data) << std::endl; // Size of pointer 

    A<int, 3> v; 
    std::cout << sizeof(v.data) << std::endl; // Size of data 

    A<int, 4> w; 
    std::cout << sizeof(w.data) << std::endl; // Size of data 

    return 0; 
} 

回答

3

您可以在一般情况下引入默认void模板参数使用std::enable_if

template <typename T, unsigned int N, typename = void> 
class A 
{ 
public: 
    T* data; 
}; 

template <typename T, unsigned int N> 
class A<T, N, typename std::enable_if<N == 3 || N == 4>::type> 
{ 
public: 
    T data[N]; 
}; 

live wandbox example


如果N == 3 || N == 4true,然后typename std::enable_if<N == 3 || N == 4>::type合式和的计算结果为void。然后选择专业化。

如果N == 3 || N == 4false,然后typename std::enable_if<N == 3 || N == 4>::type形成不良和专业化是“SFINAEd走”。然后选择一般情况。

+0

太棒了它的作品。我想这是C++中的某种元编程吗?我不习惯它,想知道这样我就可以拿起一本书开始学习它,因为那个“SFINAEd”我不明白。 – BRabbit27

+0

@ BRabbit27:是的,这是一种元编程的形式。我真的没有一本书可以推荐(对不起),但是如果你是Google的“sfinae”和“template metaprogramming C++ 11”,那么你可能会找到有用的资源。 –