gpt4 book ai didi

c++ - 从同一模板派生的模板类

转载 作者:行者123 更新时间:2023-11-28 05:13:26 29 4
gpt4 key购买 nike

我有一个等价于下面的代码:

struct Empty {
static constexpr int id = 0;
};

template <typename Self, typename Base = Empty> struct Compound : public Base
{
int get_id() const
{
return Self::id;
}
};

struct A : Compound<A>
{
static constexpr int id = 0xa;
};

struct B : Compound<B, A>
{
static constexpr int id = 0xb;
};

template <typename T, typename Base> int get_id(const Compound<T, Base> &c)
{
return c.get_id();
}


int test_a()
{
A var;
return get_id(var);
}

int test_b()
{
B var;
return get_id(var);
}

test_b 无法编译并出现以下错误:

error: no matching function for call to 'get_id(B&)'
return get_id(var);
^
note: candidate: template<class T, class Base> int get_id(const Compound<T, Base>&)
template <typename T, typename Base> int get_id(const Compound<T, Base> &c)
^
note: template argument deduction/substitution failed:
note: 'const Compound<T, Base>' is an ambiguous base class of 'B'
return get_id(var);

我明白为什么会这样。 B 派生并可转换为 Compound<B, A>Compound<A, Empty>

我想知道是否可以更改(在 C++14 的上下文中)复合模板和 get_id() 函数,以便它为 A 返回 0xa,为 B 返回 0xb,并且适用于任意长的继承链.

我知道这可以通过在 A 和 B 中重写的虚函数轻松解决,但我想尽可能避免这种情况。在所有使用这些类型的地方,它们都是已知的并在编译时固定,因此不需要产生运行时开销。

最佳答案

保持简单:

template <class T>
auto get_id(T const& c) -> decltype(c.get_id())
{
return c.get_id();
}

不需要 c 是某种复合,您真的只希望它有一个get_id() 成员函数。

关于c++ - 从同一模板派生的模板类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43127899/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com