所以我有这个结构:
template <typename T>
struct _vect2 {
T x;
T y;
_vect2(T x, T y) : x(x), y(y) { }
_vect2() { }
};我想创建一个函数,它接受“无限”数量的结构。
template <typename T, _vect2<T>... Args>
double vect_distance(Args... arguments) {}它应该如何工作:
struct vect_2i : public _vect2<int> {
vect_2i() : _vect2() { }
vect_2i(int x, int y) : _vect2(x, y) { }
};
vect_2i vect1, vect2;
auto distance = vect_distance(vect1, vect2);在这段代码中,我得到了一个语法错误,我不知道为什么。正确的处理方法是什么?
发布于 2020-06-16 02:11:56
您可以推断出第一个参数的类型,并强制其他参数派生自/成为相同推导出的T类型的向量。
在c++20中
#include <concepts>
template <typename T>
double vect_distance(const vect2<T>& head,
const std::derived_from<vect2<T>> auto&... tail);在c++17中
#include <type_traits>
template <typename T, typename... Ts>
auto vect_distance(const vect2<T>& head, const Ts&... tail)
-> std::enable_if_t<(std::is_base_of<vect2<T>, Ts>{} && ...), double>;在c++14中
#include <type_traits>
template <bool...>
struct bool_pack {};
template <typename T, typename... Ts>
auto vect_distance(const vect2<T>& head, const Ts&... tail)
-> std::enable_if_t<std::is_same<bool_pack<true, std::is_base_of<vect2<T>, Ts>{}...>,
bool_pack<std::is_base_of<vect2<T>, Ts>{}..., true>
>{}, double>;https://stackoverflow.com/questions/62393834
复制相似问题