使用单个函数的替代版本可能更紧凑:
struct Derived1 : Base
{
Derived1() : Base(theFlag(this)) {}
};
然后在标题中:
template <typename T>
bool theFlag(T*)
{
if (typeid(T) == typeid(Derived1)) return true;
if (typeid(T) == typeid(Derived2)) return false;
if (typeid(T) == typeid(Derived3)) return true;
throw std::runtime_error("No theFlag is given for this type");
}
如果您与编译时检查结婚,那么您能做的最好的事情就是引入一些重复:
template <typename T>
bool theFlag(T*)
{
static_assert(
std::is_same<T, Derived1>::value ||
std::is_same<T, Derived2>::value ||
std::is_same<T, Derived3>::value,
"No theFlag is given for this type"
);
if (typeid(T) == typeid(Derived1)) return true;
if (typeid(T) == typeid(Derived2)) return false;
if (typeid(T) == typeid(Derived3)) return true;
}
theFlag
这基本上依赖于 SFINAE -如果您使用不受支持的参数调用它,编译器将无法找到重载,本质上。