我正在设计一个管道类,它需要std::variant
从过滤器类中的不同类型列表中提取一个。例如:
template <typename T>
struct Filter {
using type = T;
// ...
}
template <typename... Filters>
struct Pipeline {
// how to properly define the variant type?
// std::variant<Filters::type...> buffer;
};
例如,如果我有三种不同的过滤器类型:
Filter<int>, Filter<double>, Filter<std::string>
那么,变体应该是std::variant<int, double, std::string>
. 但是,我需要删除变体中的重复类型,例如:
Filter<int>, Filter<double>, Filter<std::string>, Filter<int>
那么,变体不应该是std::variant<int, double, std::string, int>
but std::variant<int, double, std::string>
。此外,我需要替换void
为std::monostate
. 例如:
Filter<int>, Filter<double>, Filter<void>, Filter<int>, Filter<void>
那么,变体应该是std::variant<int, double, std::monostate>
.
如何template <typename... Filters>
使用 c++17 设计这样一个可以根据给定类型名称正确定义变体类型的元类?