jnn*_*nnn 4 c++ templates metaprogramming
编辑:对不起,这个问题是重复的.原文:SFINAE检查继承的成员函数
我有一个模板化的函数(在用于测试的类中):
template <class CHandler>
void InitHandler(CHandler &handler)
{
handler.setId(0);
handler.SetCache(m_pCache.get());
handler.m_pScience = m_pScience;
}
Run Code Online (Sandbox Code Playgroud)
但是,可能会使用没有m_pScience成员的模板参数调用此函数.
我是否可以使用模板元编程来设置此成员(如果存在)?
重新想象这个答案:如何检测类中是否有特定的成员变量?:
template<typename T> struct Hasm_pScience
{
struct Fallback { int m_pScience; }; // introduce member name "m_pScience"
struct Derived : T, Fallback { };
template<typename C, C> struct ChT;
template<typename C> static char (&f(ChT<int Fallback::*, &C::m_pScience>*))[1];
template<typename C> static char (&f(...))[2];
static bool const value = sizeof(f<Derived>(0)) == 2;
};
struct A { float m_pScience; };
struct B { int X; };
int main(int argc, _TCHAR* argv[])
{
std::cout << Hasm_pScience<A>::value << std::endl; // 1
std::cout << Hasm_pScience<B>::value << std::endl; // 0
return 0;
}
Run Code Online (Sandbox Code Playgroud)
谷歌的一般原则是SFINAE(替换失败不是错误).