我目前使用的模板类有多个参数,
template<class A, class B> class M{ };
但是,在类A
的位置,我想插入一个类似
template<class C> class A{ };
我发现这样做的唯一解决方案是使用模板模板参数:
template< template<class C> class A, class B> class M{ };
在我的实现中,我使用的A
的唯一参数化是A<B>
。我不需要使用不同参数的A
的多个实例化,例如,我不需要在A<int>
中实例化A<double>
A<long double>
和M
。
是否有替代模板模板参数?我问的原因是对thread的跟进,在他的回答中@Evan Teran说他只有一次必须使用模板模板参数......
我想我的问题就是:使用模板模板参数有缺点吗?
答案 0 :(得分:2)
假设B
可以从A<B>
以某种方式确定,您可以只使用一个模板参数:
template <class A> class M
{
typedef typename A::The_B_Type B;
};
当然,The_B_Type
必须是A<B>
中的有效typedef。这是标准库容器提供所有typedef的原因之一。例如,如果模板A
为std::vector
,则可以执行此操作:
template <class A> class M
{
typedef typename A::value_type B;
};
答案 1 :(得分:1)
您可以将实例化的A<B>
作为参数,然后使用traits类在需要时提取传递给B
的{{1}}:
A<B>
traits类命名不佳,但您可以看到我可以从template<typename T>
struct extract_b {}; // SFINAE enabled
template<template<class>class A, typename B>
struct extract_b< A<B> > {
typedef B type;
};
// C++11, you can replace it with typename extract_b<T>::type at point of use
// if you lack support for it:
template <typename T>
using ExtractB = typename extract_b<T>::type;
template<typename A>
struct M {
typedef ExtractB<A> B;
// ...
};
中获取template
参数并在A<B>
中公开。