有没有办法从编译器中提取部分默认特化?
假设我有这两个参数模板:
template<typename A, typename B>
struct X {
A a;
B b;
};
我还有一些使用单个参数模板的代码,如下所示:
template<template<typename> class T, typename B>
struct make_T_of_B {
T<B> member;
};
我希望能够说:
make_T_of_B<X<int>, double> dummy;
其中X&lt; int&gt;被视为单个参数模板。它等同于这个模板:
template<typename B>
struct Y {
int a;
B b;
};
看起来像是如何专门化X&lt; int,B&gt;没有改变任何东西。它的方式类似于默认的特化 - 除了默认的特化不会产生另一个模板,而是一个实际的类型(换句话说,它总是全部)。
我意识到我可以级联模板参数
template<typename A>
struct Z1 {
// start from scratch
template<typename B>
struct Z2 {
A a;
B b;
};
// inherit from double template above
template<typename B>
struct X: ::X<A, B> {};
};
make_T_of_B<Z1<int>::Z2, double> dummy1;
make_T_of_B<Z1<int>::X, double> dummy2;
但我觉得这很难阅读,也没有清楚地表达我的意图。
谢谢。
答案 0 :(得分:2)
我误解了你的问题。你想要的只是一种绑定第一个模板参数的方法,你可以很容易地做到这一点:
template <typename T> using Foo = X<int, T>;
现在Foo<double>
与X<int, double>
相同。
如果没有C ++ 11风格的别名,您可以通过更多样板来实现相同的目标:
template <typename T> struct Foo
{
typedef X<int, T> type;
};
现在使用Foo<double>::type
。
答案 1 :(得分:0)
我会使用一个特性:
template <typename> struct applicator;
template <template <typename> class Tmpl, typename T>
struct applicator<Tmpl<T>>
{
template <typename A>
using rebind = make_T_of_B<Tmpl, A>;
};
现在你可以说:
applicator<X<int>>::rebind<double> dummy;
您当然也可以将第二个参数A
移动到主模板中:
template <typename, typename> bpplicator;
template <template <typename> class Tmpl, typename T, typename A>
struct bpplicator<Tmpl<T>, A>
{
using type = make_T_of_B<Tmpl, A>; // or "typedef make_T_of_B<Tmpl, A> type;"
};
bpplicator<X<int>, double>::type dummy;
这样做的好处是它也适用于C ++ 03。