与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?
答案 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
}