假设我们有两个类
struct A
{
int x = 1;
};
struct B
{
int y = 2;
};
我想要一个模板,该模板将返回成员的值(在A的情况下,我想返回“x”的值,在B的情况下,我想返回“y”的值)。
示例调用:
const auto myVariable = f<A>();
要么
A a;
const auto myVariable = f<A>(a);
我不想拥有2个模板专长-理想情况下,它将是带有某种“if语句”的一个模板,但也许不可能吗?
可以用C++ 11(但不能用C++ 14)编写。
通常,遇到此类问题时如何使用模板-很大的模板,并且只需要在一个或两个位置取不同成员的值-可以根据该变量的类型推论得出。
问题:不必要,不允许修改A类和B类
最佳答案
万一您因为在编译时想要在A和B之间切换而要求模板,并且您有理由不直接键入A或B的定义...
struct A
{
int x;
};
struct B
{
int y;
};
struct A1 : public A { int Get() const { return x; } };
struct B1 : public B { int Get() const { return y; } };
// Begin possible shortcut avoiding the template below:
#ifdef USE_A
typedef A1 Bar;
#endif
#ifdef USE_B
typedef B1 Bar;
#endif
// End possible shortcut.
template <class _Base>
struct CompileTimeAOrB
: public _Base
{
int Get() const
{
return _Base::Get();
}
};
#define USE_A
//#define USE_B
#ifdef USE_A
typedef CompileTimeAOrB<A1> Foo;
#endif
#ifdef USE_B
typedef CompileTimeAOrB<B1> Foo;
#endif
编辑:由于无法更改A和B,因此请引入A1,B1;)