模板特化功能参数计数

时间:2015-01-16 14:38:00

标签: c++ templates

好的,我之前关于模板的问题的更新(我在这个领域是个通奸)...... 我恢复了大部分问题: 是否可以为成员函数设置不同的参数计数,具体取决于类声明中使用的模板参数?

例如,构造函数:

template <typename Type, unsigned ElementCount>
class TVector
    {
    public:
    Type Values[ElementCount];

    TVector ( ElementCount number of Type here )
        { ...

这可能吗? 或者也许是一个二传手:

SetValues ( ElementCount number of Type here );

编辑: 好吧,我的错误,我没有完全解释。 此向量是三角矢量,而不是元素数组。因此,它应该支持2,3或4个值。

至于构造函数,我希望能够做类似的事情:     TVector xpto(0.0f,0.0f,0.0f,1.0f);

至于编译器,我正在使用gcc,并且如果可以安全地启用更新的c ++标准,那就是dunno。当我启用它时,它会抱怨它。所以,对我来说没有enable_if:)

感谢。

2 个答案:

答案 0 :(得分:0)

成员函数可以具有std::initializer_list<T>类型的参数,允许它访问任意数量的const T类型的对象。在这种情况下,类模板中的ElemCount可以被删除,因为您不需要必须指定参数的数量。

template <typename Type>
class TVector
    {
    public:    

    TVector ( std::initializer_list<Type> l )
        { ...

答案 1 :(得分:0)

是的,您可以使用std::enable_if

template <typename T, typename ... Ts>
struct AllSameAsT : public std::false_type
{
};

template <typename T>
struct AllSameAsT<T> : public std::true_type
{
};

template <typename T, typename T, typename ... Ts>
struct AllSameAsT : public AllSameAsT<T, Ts...>
{
};


template <typename Type, unsigned ElementCount>
class TVector
    {
    public:
    template <typename ... Ts, typename = std::enable_if_t<AllSameAsT<Type, Ts...>::value && (sizeof...(Ts) == ElementCount)>
    TVector (Ts... ts);
    };

如果你没有C ++ 14,你还需要添加

template< bool B, class T = void >
using enable_if_t = typename enable_if<B,T>::type;

正如JosephMansfield在评论中指出的那样,一个更简单的解决方案可能就是接受std::array<Type, ElementCount>