有没有办法帮助编译器处理复杂的参数推导?
Is there a way to help the compiler to process complex argument deduction?
我正在尝试构建编译时间表。我使用数组的数组的数组...要做到这一点。遗憾的是,编译器无法推断结果类型的模板参数。有解决方法吗?
#include <array>
template <typename T, size_t... dims>
struct variadic_array;
template <typename T, size_t... dims>
using variadic_array_t = typename variadic_array<T, dims...>::type;
template <typename T, size_t dim>
struct variadic_array<T, dim> {
using type = std::array<T, dim>;
};
template <typename T, size_t dim, size_t ...dims>
struct variadic_array<T, dim, dims...> {
using type = std::array<variadic_array_t<T, dims...>, dim>;
};
template <typename T, size_t ...dims>
void foo(variadic_array_t<T, dims...>) {}
void call_foo() {
foo(variadic_array_t<int, 3, 4>{});
}
编译错误:
error: no matching function for call to 'foo'
foo(variadic_array_t<int, 3, 4>{});
^~~
note: candidate template ignored: couldn't infer template argument 'T'
void foo(variadic_array_t<T, dims...>) {}
^
T
不能从C<T>::type
(非推导上下文(推导出来。
您可以通过传递简单的模板T
并从中检索信息来扭转问题:
// Helpers
template <typename T> struct is_std_array : std::false_type {};
template <typename T, std::size_t N>
struct is_std_array<std::array<T, N>> : std::true_type {};
template <typename T> struct identity { using type = T; };
// The trait
template <typename T, std::size_t...> struct variadic_array_traits;
template <typename T, std::size_t N, std::size_t ... dims>
struct variadic_array_traits<std::array<T, N>, dims...>
{
using type =
typename std::conditional_t<is_std_array<T>::value,
variadic_array_traits<T, dims..., N>,
identity<variadic_array<T, dims..., N>>>::type;
};
// For SFINAE
template <typename ... >
using void_t = void;
// Your method
template <typename T>
void_t<typename variadic_array_traits<T>::type>
foo(T)
{
using variadic_array_type = typename variadic_array_traits<T>::type;
// ...
}
演示
相关文章:
- 如何反转整数参数包
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 如何使用默认参数等选择模板专业化
- 模板参数替换失败,并且未完成隐式转换
- 具有默认模板参数的多态类的模板推导失败
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- C++复杂情况的比较器通过参数问题
- 将可变参数类型列表的扩展打包为复杂类型的初始值设定项列表 - 合法吗?
- 函数参数中使用的复杂文字'i'
- 有没有办法帮助编译器处理复杂的参数推导?
- 调用C++具有复杂参数和复杂返回类型的函数 C 代码
- 将复杂的参数放入最低功能时会出现错误吗?为什么?(Eclipse C )
- GDB 用户定义函数:如何传递复杂参数
- 带有复杂参数的初始化列表C
- JNI——可以将复杂类型作为本机方法参数传递
- 需要帮助来理解具有复杂typename参数的模板函数
- 从函数模板参数中推导复杂类型
- Regex查找复杂参数
- 提供来自C++的 C99 复杂参数