2014-10-02 102 views
1

假设我有一个类,可以采取类型和参数varadic号:如何专门化0可变参数的可变参数模板类?

template <typename T, typename... Args> 
class B 
{ 
    T<Args...> x; 
}; 

该类构成了一个别名类型,这将是这样的基础:

template <typename... Args> 
using AliasedType = B<T, Args...>; 

但有些情况下,T类型不是模板,在这种情况下,可变包的长度将为0.但是,class B仍会尝试使用一组空模板参数声明此类型的实例,从而导致错误。因此,要解决这个问题,我试图创造B模板专业化的,完全不varadic参数都:

template <typename T> 
class B<T> 
{ 
    T x; 
}; 

但这似乎并没有工作。

为了说明工作示例问题:

class A 
{ 
}; 

template <typename T, typename... Args> 
class B 
{ 
    T<Args...> x; 
}; 

template <typename T> 
class B<T> 
{ 
    T x; 
}; 

main() { 
    B<A> a; 
} 

输出是:

error: ‘T’ is not a template T<Args...> x; 

Live example here

为什么没有这个解决的特殊版本,接受非模板类型?我确信我在这里错过了一些非常明显的东西......看起来像一个空的可变模板包不像我以前所想的那样被解析为“无”。

+4

你写的代码没有意义。如果'T'是一种类型,则不能有'T '。 – 2014-10-02 23:32:25

+0

@KerrekSB好点.. – arman 2014-10-02 23:33:41

+0

显然你可以用模板模板参数编写一些*代码,但是我完全不清楚你想要实现什么,或者为什么。 – 2014-10-02 23:34:21

回答

3

这是一个想法。它可能不是最佳的,但它的工作原理。首先,您希望B的第一个参数成为模板模板参数(否则甚至会针对有效参数出现错误)。对于非模板类型,您可以将该类型包装在模板中。这甚至适用于基本类型,如double

template <template<typename...> class T, typename... Args> 
class B 
{ 
    T<Args...> x; 
}; 

template <typename T> 
struct MakeTemplate { 
    template <typename...> using type = T; 
}; 

template <typename T> 
class Testclass { 
    T datamember; 
}; 

main() { 
    B<MakeTemplate<double>::type > b1; 
    B<Testclass,int> b2; 
} 

编译没有问题,你可以看到here。可能这是你想要的吗?这就是说我只想提一提,除了声明成员变量x(在B)之外,如果您需要访问提供的类的模板参数,则只需要完整的逻辑。否则,您可以通过完全指定的类,并填写所有参数,即B< Testclass<double> >B<double>,在这种情况下,B只需要一个模板参数,并且始终为typename /类而不是模板。

相关问题