部分模板绑定,创建新模板作为类型

时间:2013-08-05 12:05:30

标签: c++ c++11 template-aliases

是否有某种方法可以将模板部分绑定到参数类型?例如,我有以下模板:

template<typename T, typename Q> struct generic { };

我有另一个模板,它将模板类作为参数,期望能够用第一种类型创建它的实例:

template<typename T, template<typename> class Impl>
struct wrapper {
    Impl<T> foo;
};

这会接受像template<typename T>这样的简单模板而不做任何更改。我现在要做的是部分绑定generic模板,仅指定Q并将其传递给wrapper。编写一些语法,可能是这样的:

template<typename T> bound = generic<T,some_type>;

我知道我几乎可以通过继承得到我想要的东西:

template<typename T> bound : public generic<T,some_type> { };

我希望尽管避免这种情况,因为它会导致基类中定义的构造函数和运算符出现问题。

1 个答案:

答案 0 :(得分:4)

在C ++ 11中,您可以使用模板别名

template<class X>
using Bind_CPP11 = generic<X, Y>;

template<class X, template<class> class Impl>
struct wrapper_CPP11
{
    Impl<X> foo;
};

在C ++ 98/03中,你可以使用简单的class composition(我不会在这里使用继承)

template<class X>
struct Bind_CPP03
{
    typedef generic<X, Y> type;
};

template<class X, template<class> class Impl>
struct wrapper_CPP03
{
    typename Impl<X>::type foo;
//  ^^^^^^^^ to extract dependent type
};

Live Example