假设我们有两个类

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;)

10-06 10:20
查看更多