5

如果不专门针对每个类模板/类,是否可以编写一个通用的“重新绑定”元函数,这样给定

 template<class > struct foo;
 struct bar;

以下

 is_same<rebind<foo<int>,float>,foo<float>> 
 is_same<rebind<bar>,bar>

有可能

is_same< rebind<std::vector<int>,float>,std::vector<float>>  

返回一个等价于 true 的类型?

4

1 回答 1

6

当然。

但请注意,任何采用可变参数模板参数列表的模板模板参数都仅限于接受只有类型参数的模板,而不是非类型参数。换句话说,下面的一般情况不起作用,std::array因为它的第二个参数是一个整数。您必须添加一个特殊情况。

主模板已经是一个特例,因为它处理不是模板特化的类。

http://liveworkspace.org/code/5b6f0cb3aec1eb74701e73d8d21aebab

template< typename bound, typename ... new_args >
struct rebind_class {
    static_assert( sizeof ...( new_args ) == 0,
         "can't rebind arguments to non-specialization" );
    typedef bound type;
};

template< template< typename ... > class template_, typename ... new_args,
    typename ... old_args >
struct rebind_class< template_< old_args ... >, new_args ... > {
    typedef template_< new_args ... > type;
};

template< typename ... args >
using rebind = typename rebind_class< args ... >::type;
于 2012-11-08T07:45:10.387 回答