【问题标题】:Inheritance with variadic templates使用可变参数模板继承
【发布时间】: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&lt;K&gt; 继承的任何类,也可能有任意数量的附加模板参数,我该怎么做?下面的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 class ofc。您究竟期望在哪里出现空白?
  • BB&lt;K,NN&gt; 我希望BB&lt;K,NN,void&gt;。我猜您不必在专业化或其他方面重复默认模板参数?
  • 是的,这就是原因。特别是因为它是最后一个。

标签: c++ templates inheritance variadic-templates


【解决方案1】:
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{};
}

这会编译。

【讨论】:

    猜你喜欢
    • 2015-11-10
    • 1970-01-01
    • 2014-05-15
    • 1970-01-01
    • 2012-03-13
    • 1970-01-01
    • 1970-01-01
    • 2019-04-25
    相关资源
    最近更新 更多