【发布时间】:2021-03-11 11:15:29
【问题描述】:
让我们想象一下简单的类型列表:
template<typename...Types>
struct TypeList
{}
我想使用这样的类型列表为每种类型在单个接口中生成 N 个虚函数,并在单个 impl 类型中生成 N 个实现,它可以衰减到接口。
我的尝试:
template<typename Type>
struct Itf_SingleType
{
virtual void process(const Type&) = 0;
};
template<typename...>
struct Itf;
template<typename...Types>
struct Itf<TypeList<Types...>> : Itf_SingleType<Types>...
{
using Itf_SingleType<Types>::process...;
virtual ~Itf() = default;
};
此时我在接口中有 N 个虚函数。但我在附加实现时遇到问题:
template<typename Type>
struct Impl_SingleType
{
void process(const Type&)
{
//can be anything at this point, so let it be this:
puts(__PRETTY_FUNCTION__);
}
};
template<typename...>
struct Impl;
template<typename...Types>
struct Impl<TypeList<Types...>> : Itf<TypeList<Types...>>, Impl_SingleType<Types>...
{
using Impl_SingleType<Types>::process...;
};
魔杖盒示例:https://wandbox.org/permlink/s0n1DX7t7we8d6mM
但是我仍然遇到两个错误:
-
不知道为什么它不能在通过将process(7)和process(const std::string&)之间进行选择。using Itf_SingleType<Types>::process...;添加到Itf来修复 -
不知道为什么尽管在
Impl中声明了using,但它仍然认为它没有超载
我们可以假设支持 C++17。
【问题讨论】:
-
我们不能被兄弟类覆盖。虚拟继承可以Demo吗?
标签: c++ templates c++17 variadic-templates