C ++专门用于模板类以获取其他模板参数

时间:2012-03-30 20:40:09

标签: c++ templates specialization

是否可以专门化模板类来获取其他模板参数?

例如:

template <typename T>
struct X {
  void foo() { cerr << "Generic" << endl;}
};


template <>
template <bool b>
struct X<int> {
  void foo() { cerr << "Specialization" << endl;}
};

我无法用g ++完成上述工作,但也许有一些技巧可以使这个工作。

修改:我不想将模板<bool b>移动到基本模板X,因为它只是X<int>.的功能 如果必须,有没有办法让用户不必为它指定任何值?我真的很喜欢 一种不沿着这条路走下去的方法。

1 个答案:

答案 0 :(得分:2)

您可以将主模板更改为接受代理特征类:

template <typename T>
struct Foo
{
    typedef typename T::type type;

    // work with "type"

    void static print() { std::cout << T::message << std::endl; }
}

然后定义特质类:

template <typename T>
struct traits
{
    typedef T type;
    static const char * const message  = "Generic";
};

现在您可以实例化Foo<traits<double>>Foo<traits<int>>,并且可以将其他行为封装到traits类中,您可以根据需要对其进行专门化。

template <>
struct traits<int>
{
    typedef int type;
    static const char * const message = "Specialized";
};