短路模板实例化

时间:2014-02-14 17:15:07

标签: c++ templates

我的代码具有以下布局

// A exists only as a true specialization
template<int Boolean>
struct A;

template<>
struct A<1> {};

// B exists only as a false specialization
template<int Boolean>
struct B;

template<>
struct B<0> {};

// then I use it like so
cond ? A<cond> : B<cond>; // actually I want to access an enumeration member value

短路是否适用于三元运算符?为什么我会收到编译器错误?

2 个答案:

答案 0 :(得分:1)

三元运算符要求true和false表达式为相同类型,或者可以折叠为公共类型。您的AB类没有通用类型,因此表达式无法解析为常见类型,从而产生错误。

答案 1 :(得分:1)

三元运算符要求您知道表达式中使用的类型以形成公共类型。

在您的情况下,您可能会使用类似(C ++ 11,请参阅std::conditional):

#include <iostream>
#include <typeinfo>
using namespace std;

// A exists only as a true specialization
template<int Boolean>
struct A;

template<>
struct A<1> {
    void func() { cout << "A"; }
    };

// B exists only as a false specialization
template<int Boolean>
struct B;

template<>
struct B<0> {
    void func() { cout << "B"; }
};


int main() {

    const bool cond = true;
    // std::conditional can provide a compile-time ternary-like evaluation
    typedef std::conditional<cond ,A<cond>,B<cond>> myType;

    myType::type Obj;
    Obj.func();


    return 0;
}

http://ideone.com/0Yrcsp