基于模板争论的条件同一模板类代码?

时间:2016-11-18 17:06:11

标签: c++ c++11 templates

Conditional compile-time inclusion/exclusion of code based on template argument(s)?类似。

(BTW上面的问题2中的答案2根本没有编译)

(C ++ 11及以上)

我下面的类描述,想要Outer :: Inner< ...>是一个类型,以便用作模板参数等。

kwargs

我只能想到某事。如下。

template<typename T>
struct Outer {
  __enable_if__(cond_1<T>()) {
    // Does not compile if T fails cond_1
    template<typename> Inner { ... }; 
  }
  __enable_if__(cond_2<T>()) {
    // Does not compile if T fails cond_2
    template<typename> Inner { ... }; 
  }
};

问题在于这种方式根本无法扩展。

外部依赖于 所有 可能的T,这很容易导致循环标头依赖。

Outer是否有任何解决方案不依赖于T?

1 个答案:

答案 0 :(得分:0)

不确定理解你的问题,但我试图简化你的例子。

以下解决方案有什么问题?

#include <iostream>
#include <type_traits>

struct BaseA { static constexpr int va = 111; };
struct BaseB { static constexpr int vb = 222; };

struct C : public BaseA {};
struct D : public BaseB {};

template<typename T>
struct Outer
 {
   template <typename S, bool B = true>
   struct InnerI;

   template <typename S>
   struct InnerI<S, std::is_base_of<BaseA, T>::value>
    { static constexpr int v { T::va }; };

   template <typename S>
   struct InnerI<S, std::is_base_of<BaseB, T>::value>
    { static constexpr int v { T::vb }; };

   template <typename S>
   using Inner = InnerI<S>;
 };


int main()
 {
   std::cout << Outer<C>::Inner<int>::v    << std::endl;    // print 111
   std::cout << Outer<D>::Inner<long>::v   << std::endl;    // print 222
   // std::cout << Outer<int>::Inner<char>::v << std::endl; // compilation error
 }