从类型名称列表中提取 C++ 变体类型
Extract a c++ variant type from a list of type names
我正在设计一个管道 class,它需要从过滤器 class 中的不同类型列表中提取 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>
正确定义变体类型的元class?
基于:
#include <variant>
template <typename T, typename... Ts>
struct unique { using type = T; };
template <typename... Ts, typename U, typename... Us>
struct unique<std::variant<Ts...>, U, Us...>
: std::conditional_t<(std::is_same_v<U, Ts> || ...),
unique<std::variant<Ts...>, Us...>,
unique<std::variant<Ts..., U>, Us...>> {};
template <typename... Ts>
using variant_t = typename unique<
std::variant<>,
std::conditional_t<std::is_same_v<Ts, void>, std::monostate, Ts>...>::type;
那么你的Pipeline
可以定义为:
template <typename T>
struct Filter {
using type = T;
};
template <typename... Filters>
struct Pipeline {
variant_t<typename Filters::type...> buffer;
};
我正在设计一个管道 class,它需要从过滤器 class 中的不同类型列表中提取 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>
正确定义变体类型的元class?
基于
#include <variant>
template <typename T, typename... Ts>
struct unique { using type = T; };
template <typename... Ts, typename U, typename... Us>
struct unique<std::variant<Ts...>, U, Us...>
: std::conditional_t<(std::is_same_v<U, Ts> || ...),
unique<std::variant<Ts...>, Us...>,
unique<std::variant<Ts..., U>, Us...>> {};
template <typename... Ts>
using variant_t = typename unique<
std::variant<>,
std::conditional_t<std::is_same_v<Ts, void>, std::monostate, Ts>...>::type;
那么你的Pipeline
可以定义为:
template <typename T>
struct Filter {
using type = T;
};
template <typename... Filters>
struct Pipeline {
variant_t<typename Filters::type...> buffer;
};