gpt4 book ai didi

c++ - 调度模板

转载 作者:搜寻专家 更新时间:2023-10-31 00:53:19 25 4
gpt4 key购买 nike

我尝试使用 if constexpr 在两个函数之间进行分派(dispatch)。调度程序函数应该接受例如 std::size_t 和任意类类型。

如果我只是用标量类型调用它,它会起作用,但如果我尝试传递一个类类型,它会触发一个编译错误,这对我来说并不是很有帮助(请参见下文)。

请看看我目前的做法:

template <auto Other>
constexpr auto mul() const {
if constexpr (std::is_scalar_v<decltype(Other)>)
return mul_with_scalar<Other>();
else
return mul_with_matrix<Other>();
}

template <size_t Scalar>
constexpr auto mul_with_scalar() const {
return apply([](size_t v, auto) { return v * Scalar; },
std::make_index_sequence<Size>{});
}

template <class Other>
constexpr auto mul_with_matrix() const {
return size_t{0}; // implement me
}
note: candidate: template<auto Other> constexpr auto matrix<Rows, Cols, Vals>::mul() const [with auto Other = Other; long unsigned int Rows = 3; long unsigned int Cols = 3; long unsigned int ...Vals = {}]
constexpr auto mul() const {
^~~
./constexpresian/matrix.hpp:81:18: note: template argument deduction/substitution failed:

最佳答案

I wan't that the function mul can handle non-type and type parameters.

这在 C++ 中是不可能的。模板参数可以是类型或值(或模板),但不能两者都是。 template<auto Name>使 Name一个值模板参数,其值的类型将在传递值时推导。

但由于它是一个编译时值,您可以将其值包装在一个类型中。对于整数类型,std::integer_constant将工作。对于允许其他类型的值参数的 future C++ 修订版,您将不得不使用更通用的包装器。

关于c++ - 调度模板 <auto>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49181032/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com