default具有相同类型的Type参数键入模板的noneType参数

时间:2013-11-21 15:04:26

标签: c++ templates

好的,我怎样才能在使用之前声明C?或者这不可能吗?

// g++ error: 'C' has not been declared
// syntax error : identifier 'C'

template<C v, typename T, typename C = size_t> 
class keyedType {
    typedef T type;
    static constexpr C index = v;
};

2 个答案:

答案 0 :(得分:1)

您可以通过使v模板参数具有默认值来回避它,例如

template<typename T, typename C = size_t, C v = C()> 
class keyedType {
    typedef T type;
    static constexpr C index = v;
};

答案 1 :(得分:0)

我最终解决了这个问题如下。

使用嵌套类的改进解决方案。

template<typename I = size_t > class IdxType { 
    public : typedef I type; 

    template< I::type v, typename T> class keyedType {
    typedef T type;
    static const typename I::type index = v;
};
 };

// Use a follows.
IdxType<>::keyedType<0,char>

//A different type.
IdxType<long>::keyedType<5, int>

嵌套/继承似乎是一种在需要时对参数进行排序的方法。即使在varidic args之后指定尾随参数也很有用。

考虑的其他解决方案包括使用继承对参数进行排序,并使用默认参数进行声明。这些的一个必然结果是我现在可以在任何位置传递带有默认值的参数。     template class keyIndexType {public:typedef T type; };     模板类anotherIndexType {public:typedef T type; };

template< template<typename = size_t> class keyType
            , typename keyType<>::type v, typename T
        > class keyedType {
    typedef T type;
    static const typename keyType<>::type index = v;
};


// Use a follows.
keyedType<keyIndexType , 0,char>

//Need to define a new template if we want to change the type and then use as follows.
keyedType<anotherIndexType, 5, int>