gpt4 book ai didi

c++ - 如何为非类型模板arg定义等效规则

转载 作者:行者123 更新时间:2023-12-02 01:26:55 25 4
gpt4 key购买 nike

经过一段时间的弄清楚my question我发现编译器如何从一组“标签”(非类型模板参数)中推导出模板参数非常令人着迷。但看起来编译器只理解“逐字节”相等规则。

我的意思是这段代码:

struct S1 {
constexpr S1(int v) : _v(v)
{};
constexpr bool operator == (const S1& other) { return true;}
int _v;
};

template <S1 Tag, typename ValueType>
struct TagedValue { ValueType value; };

struct Test : TagedValue<S1{0}, int>, TagedValue<S1{1}, double> {};

template <S1 Idx, typename T>
auto& get(TagedValue<Idx, T>& test) {
return test.value;
}

int main()
{
Test test;
get<S1{1}>(test); // Still compiles, even though S1{0} == S1{1}
static_assert(S1{0} == S1{1});
}

正如你所看到的,我定义了自己的operator ==,它基本上是说:“任何两个实例都是相等的”。但看起来为了在 get 函数中推导出 T ,编译器仍然检查结构的实际内容是否相同。也就是说,出于类型推导的目的 S1{0} != S2{1},即使来自“C++ 点的 S1{0} == S2{1} View ”。

我的问题是:有什么方法可以重新定义“类型推导相等规则”吗?

UPD:为了使其更清楚,如果我替换此行

    struct Test : TagedValue<S1{0}, int>, TagedValue<S1{1}, double> {};

    struct Test : TagedValue<S1{1}, int>, TagedValue<S1{1}, double> {};

编译器给出一个错误,提示不明确。

最佳答案

模板参数推导,以及其他模板相关的东西,使用type equivalence的概念。与您的问题相关的部分如下:

temp.type/1 Two template-ids are the same if
...
(1.3) - their corresponding non-type template-arguments are template-argument-equivalent (see below) after conversion to the type of the template-parameter...

temp.type/2 Two values are template-argument-equivalent if they are of the same type and
...
(2.10) - they are of class type and their corresponding direct subobjects and reference members are template-argument-equivalent.

粗略地说,这是成员之间的平等。不,您不能覆盖它。

关于c++ - 如何为非类型模板arg定义等效规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74309235/

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