【发布时间】:2018-05-22 17:12:19
【问题描述】:
我正在尝试将继承与可变参数模板一起使用。 首先,将以下 sn-p 视为我要构建的框架。
#include <type_traits>
#include <iostream>
template <typename K> class A1; // fwd decl
template <typename K,
template <typename> class NN = A1,
class = typename std::enable_if< std::is_base_of< A1<K>, NN<K> >::value >::type >
class BB;
template <typename K>
class A1 { public: friend class BB<K>; };
template <typename K>
class A2 : public A1<K> {
};
template <typename K, template <typename> class NN>
class BB<K,NN> {
NN<K>* ref;
public:
BB() : ref{ new NN<K>{} } { std::cout << "ctor...\n"; };
};
int main() {
BB<size_t> b1{}; //use default A1
BB<size_t, A2> b2{};
}
我们在这里得到的是,我可以将类 BB 与继承自 A1 的任何类一起使用,该类恰好具有 1 个模板参数。
问题:
我想修改此模式,使模板参数NN 可以是从A1<K> 继承的任何类,也可能有任意数量的附加模板参数,我该怎么做?下面的sn-p是粗略的思路
template <typename K> class A1; // fwd decl
template <typename K,
template <typename, typename...> class NN = A1,
class = typename std::enable_if< std::is_base_of< A1<K>, NN<K,typename...> >::value >::type,
typename...Types >
class BB;
template <typename K>
class A1 { public: friend class BB<K>; };
template <typename K, typename V>
class A2 : public A1<K> {
V local;
};
template <typename K,
template <typename, typename...> class NN,
typename...Types>
class BB<K,NN,void,Types...> {
NN<K,Types...>* ref;
public:
BB() : ref{ new NN<K,Types...>{} } { std::cout << "ctor...\n"; };
};
int main() {
BB<size_t> b1{}; //use default A1
BB<size_t, A2, char> b2{}; // can I specialize this way??
}
有可能吗? 任何帮助是极大的赞赏。 VS2017还是GCC无所谓。
【问题讨论】:
-
NN不是class,而是template class。它们与类和变量一样不同;我不知道您将NN用作class是否暴露了对术语的误解或对您的问题的误解。其次,您的第一个代码块看起来不应该工作,因为它应该需要,void,但它以某种方式编译。我很困惑。 -
是的
template classofc。您究竟期望在哪里出现空白? -
BB<K,NN>我希望BB<K,NN,void>。我猜您不必在专业化或其他方面重复默认模板参数? -
是的,这就是原因。特别是因为它是最后一个。
标签: c++ templates inheritance variadic-templates