是否可以使用不带参数的模板专门化?

时间:2016-11-04 16:09:35

标签: c++ templates

我为自己做这个语法,因为我觉得以后会更方便。

temolate<typename U> struct identity{typedef U type;};
temolate<typename T, typename identity<T>::type value=0> struct my{
    typedef std::vector<T> vec;
    typedef std::array<T,value> arr;
    typedef std::set<T> set;
    // and so forth
};  

我用它:

int main(){
    my<int>::vec v;   // okay
    my<int,3>::arr a; // okay
    // and so forth
}

但我也希望这样做:
我的)

template<??????????>  // what should I do here?
struct my<?????????>{ // or may be here
    typedef int i;
    typedef float f;
    typedef double d;
    // and so forth;
}

所以我可以这样做:

int main(){
    my::i a; // for int, what should I do?
    my::f b; // for float,  and
    my::d c; // for double, and
    // AND I ALSI CAN
    my<int>::vec v;    // already I know
    my<int,3>::arr a;  // and know
}

有可能吗?

我在这里看到:
Default template parameter partial specialization 在我问之前。所以我知道my<>::i是可能的。

我也知道如何将别名一起使用

我只是问有可能吗?而不是对我说 NO ,而是让我 downvote

2 个答案:

答案 0 :(得分:4)

您可以将T默认为特殊类型(此处为default_type),然后专门针对它:

template<typename U> struct almost_identity{typedef U type;};

class default_type{};

template<> struct almost_identity<default_type>{ typedef int type; };

template<typename T = class default_type, typename almost_identity<T>::type value = 0> struct my{
    typedef std::vector<T> vec;
    typedef std::array<T,value> arr;
    typedef std::set<T> set;
    // and so forth
};

template<>
struct my<default_type, 0>
{
    typedef int i;
    typedef float f;
    typedef double d;
};

demo

这样您就可以使用my<>::i

如果你绝对希望my::imy<int>::vec是正确的,那么据我所知,没有办法实现这一点。

答案 1 :(得分:1)

您愿意接受一个不同的名称,您可以使用使用声明来做类似的事情:

using myy = my<int>;

然后将您的类型称为:

myy::i