最近、私はテンプレートをいじっていて、次の問題に遭遇しました。次のような 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";
};
}
残念ながら、これまでに呼び出されたのは 2 番目のバージョンだけです。明らか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"
これから抜け出す方法はありますか?
ヒントをありがとう。アルネ