【发布时间】:2021-09-30 00:12:45
【问题描述】:
我正在设计一个管道类,它需要从过滤器类的不同类型列表中提取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>,而是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>。
如何使用c++17设计这样一个元类,可以根据给定的类型名称template <typename... Filters>正确定义变体类型?
【问题讨论】:
-
这里有How to filter duplicate types from tuple C++ - Stack Overflow,剩下的你可能需要像往常一样实现模板元编程。
-
我不认为 c++ 编译器可以直接做到这一点。您可能需要在
std::tuple的帮助下重新设计您的代码。
标签: c++ templates c++17 std-variant