Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何仅设置成员(如果存在)?_C++_Templates_Metaprogramming - Fatal编程技术网

C++ 如何仅设置成员(如果存在)?

C++ 如何仅设置成员(如果存在)?,c++,templates,metaprogramming,C++,Templates,Metaprogramming,编辑:对不起,这个问题是重复的。原件: 我有一个模板函数(在用于测试的类中): 模板 void InitHandler(钱德勒和汉德勒) { handler.setId(0); SetCache(m_pCache.get()); handler.m_pScience=m_pScience; } 但是,可能会使用不具有m_pScience成员的模板参数调用此函数 是否可以使用模板元编程仅设置此成员(如果存在) 通常,当您需要模板中的某个成员时,您应该强制该模板的用户实现它,即使它对他们没有任何作

编辑:对不起,这个问题是重复的。原件:

我有一个模板函数(在用于测试的类中):

模板
void InitHandler(钱德勒和汉德勒)
{
handler.setId(0);
SetCache(m_pCache.get());
handler.m_pScience=m_pScience;
}
但是,可能会使用不具有m_pScience成员的模板参数调用此函数


是否可以使用模板元编程仅设置此成员(如果存在)

通常,当您需要模板中的某个成员时,您应该强制该模板的用户实现它,即使它对他们没有任何作用。常见的例子有stl
set
map
,其中您需要定义一个
操作符重新想象这个答案:

template struct Hasm\u pScience
{ 
结构回退{int m_pScience;};//引入成员名称“m_pScience”
派生结构:T,回退{};
模板结构;
模板静态字符&f(ChT*)[1];
模板静态字符(&f(…)[2];
静态布尔常量值=sizeof(f(0))==2;
}; 
结构A{float m_pScience;};
结构B{int X;};
int main(int argc,_TCHAR*argv[]
{

std::cout如果你将是唯一一个在它的余生中维护它的人:)我几乎可以肯定这只会引起比它解决的问题更多的麻烦。我想不出一种方法来做到这一点,它不涉及对接口的更改,这意味着你应该重新考虑你在这里概述的设计。如果目标类是CHandler
,没有公共的
m_pScience
成员,编译器将在模板实例化时通知您。这几乎是,但并不完全相同:这让您检查它,但不需要有条件地对它做任何事,因为如果您执行void func(){if(Hasm_pScience::value),则将是一个编译器错误{a.pScience=1;}}如果Hasm的计算结果为false。
template <class CHandler>
void InitHandler(CHandler &handler)
{
    handler.setId(0);
    handler.SetCache(m_pCache.get());
    handler.m_pScience = 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;
}