我的代码具有以下布局
// 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
短路是否适用于三元运算符?为什么我会收到编译器错误?
答案 0 :(得分:1)
三元运算符要求true和false表达式为相同类型,或者可以折叠为公共类型。您的A
和B
类没有通用类型,因此表达式无法解析为常见类型,从而产生错误。
答案 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;
}