我正在尝试对可变参数模板使用继承。 首先,将以下代码段视为我要构建的框架。
#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>
继承的任何类也可能有任意数量的附加模板参数,我该怎么做?以下片段是粗略的想法
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 无所谓。
最佳答案
template <typename K> class A1; // fwd decl
template<class...>struct types_t {};
template <class K0, class Types=types_t<>, template<class...>class NN=A1, class=void>
class BB;
template <typename K>
class A1 { public: friend class BB<K>; };
template <class K, class other>
class A2 : public A1<K> {
};
template<class K, class...Ks>
class A3 : public A1<K> {};
template<class K0, class...Ks, template<class...>class NN>
class BB<
K0,
types_t<Ks...>,
NN,
std::enable_if_t<
std::is_base_of<
A1<K0>,
NN<K0, Ks...>
>{}
>
>{
NN<K0, Ks...>* ref = nullptr;
public:
BB() : ref{ new NN<K0, Ks...>{} } { std::cout << "ctor...\n"; };
};
int main() {
BB<size_t> b1{}; //use default A1
BB<size_t, types_t<char>, A2> b2{};
BB<size_t, types_t<int, char>, A3> b3{};
}
这编译。
关于c++ - 可变参数模板的继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50473176/