gpt4 book ai didi

c++ - 在模板类中匹配 CRTP

转载 作者:行者123 更新时间:2023-11-30 04:32:07 32 4
gpt4 key购买 nike

最近我一直在摆弄模板并偶然发现了以下问题。我正在像这样实现 CRTP 模式:

template<typename derived_t>
struct protocol_object
{
...
};

struct data_object : public protocol_object<data_object>
{
...
};

我现在想匹配 class protocol_object 的实例在成员模板函数中,同时仍然接受非 CRTP 类型:

struct consumer_impl
{
template<typename derived_t>
void match(protocol_object<derived_t> &value)
{
std::cout << "protocol_class";
};

template<typename T>
void match(T &value)
{
std::cout << "any other type";
};
}

不幸的是,只有第二个版本被调用。显然 match(protocol_object<derived_t> &value)不考虑或拒绝支持更一般的形式 match(T &value) .

data_object object;
double value;
consumer_impl consumer;

consumer.match(value); // yields "any other type" OK
consumer.match(object); // also yields "any other type" but want "protocol_class"

有没有办法解决这个问题?

感谢任何提示。阿恩

最佳答案

这与 CRTP 无关。这是以下的一般情况:

  • 设计一个模板函数,使所有派生类都使用特定的特化。

问题是 T& valueDerived& 的精确匹配,而 Base& 是不精确匹配。因此,我们将使一般形式成为更差的匹配:

struct conversion_required { conversion_required(int) {} };

template<typename derived_t>
void match_impl(protocol_object<derived_t> &value, int)
{
std::cout << "protocol_class";
};

template<typename T>
void match_impl(T &value, conversion_required)
{
std::cout << "any other type";
};

template<typename T>
void match(T& value)
{
return match_impl(value, 0);
}

现在,需要向上转换的特化比需要用户定义转换的通用模板更匹配。

关于c++ - 在模板类中匹配 CRTP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7870048/

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