【发布时间】:2021-06-30 19:50:02
【问题描述】:
我有一个示例参数包函数:
template<typename T, typename ... Args>
constexpr bool all_values_equal(T first, Args... args) {
return ((first == args) && ...);
}
static_assert(all_values_equal(1, 1, 1.0));
我经常使用std::tuple,因为我喜欢能够使用模板。提取类型、切片类型和其他排列方式。
如何使用std::tuple 调用此函数?
template<typename ... Args>
constexpr bool all_values_equal(std::tuple<Args...> tuple) {
return /* ??? */ ;
}
static_assert(all_values_equal(std::make_tuple(1, 1, 1.0)));
我也想知道不带参数的可变参数模板函数的情况:
template<typename T, typename ... Args>
constexpr bool all_types_equal() {
return (std::is_same_v<T, Args> && ...);
}
template <template<typename ... Args> class Tuple>
constexpr bool all_types_equal() {
return /* ??? */ ;
}
static_assert(all_types_equal<int, int>());
static_assert(all_types_equal<std::tuple<int, int>>());
最终我希望能够像这样调用所有 4 个变体:
static_assert(all_values_equal(1, 1, 1.0));
static_assert(all_values_equal(std::make_tuple(1, 1, 1.0)));
static_assert(all_types_equal<int, int>());
static_assert(all_types_equal<std::tuple<int, int>>());
并且std::tuple 函数不应重新实现可变参数模板函数的逻辑。
我怎样才能以干净和现代的方式实现这一目标?
【问题讨论】:
标签: c++ tuples variadic-templates c++20