对 C++ 11 可变模板参数进行操作,存储到元组中
operate on c++ 11 variadic template parameters, store into tuple
我正在尝试使用可变模板参数学习一些 C++ 11。
我想为 convertTest() 获取一个浮点输入参数列表,然后 return 一个 std::tuple 整数。我尝试在 g++ 中编译以下内容:
template<typename ...ArgsIn, typename ...ArgsOut>
static inline std::tuple<ArgsOut...> convertTest(float nextArg, ArgsIn... remainingArgs)
{
auto a = convertTest(remainingArgs...);
auto b = std::make_tuple(int(nextArg));
auto c = std::tuple_cat(a, b);
return c;
}
static inline std::tuple<int> convertTest(float lastArgIn)
{
return std::make_tuple((int)lastArgIn);
}
int main()
{
auto res = convertTest(0.5f, 10.11f);
return 0;
}
我收到以下错误:
error: conversion from 'std::tuple<int, int>' to non-scalar type 'std::tuple<>' requested
我不确定为什么 return 类型 std::tuple<ArgsOut...>
会解析为 std::tuple<>
。有什么想法吗?
我试过制作 return 类型 auto
,但我收到关于缺少尾随 return 类型的投诉。
有什么想法吗?
Argout
不可推导,所以成为空表。
所以你必须按照那个顺序编写函数
template<typename ... ArgsOut, typename ...ArgsIn>
static std::tuple<ArgsOut...> convertTest(float nextArg, ArgsIn... remainingArgs);
并称之为
convertTest<int, int>(0.5f, 10.11f);
顺便说一句,你可以简单地写成这样(删除你独占的事实float
)
template<typename ...Args>
auto convertTest(Args... args)
-> decltype(std::make_tuple(static_cast<int>(args)...))
{
return std::make_tuple(static_cast<int>(args)...)
}
我正在尝试使用可变模板参数学习一些 C++ 11。
我想为 convertTest() 获取一个浮点输入参数列表,然后 return 一个 std::tuple 整数。我尝试在 g++ 中编译以下内容:
template<typename ...ArgsIn, typename ...ArgsOut>
static inline std::tuple<ArgsOut...> convertTest(float nextArg, ArgsIn... remainingArgs)
{
auto a = convertTest(remainingArgs...);
auto b = std::make_tuple(int(nextArg));
auto c = std::tuple_cat(a, b);
return c;
}
static inline std::tuple<int> convertTest(float lastArgIn)
{
return std::make_tuple((int)lastArgIn);
}
int main()
{
auto res = convertTest(0.5f, 10.11f);
return 0;
}
我收到以下错误:
error: conversion from 'std::tuple<int, int>' to non-scalar type 'std::tuple<>' requested
我不确定为什么 return 类型 std::tuple<ArgsOut...>
会解析为 std::tuple<>
。有什么想法吗?
我试过制作 return 类型 auto
,但我收到关于缺少尾随 return 类型的投诉。
有什么想法吗?
Argout
不可推导,所以成为空表。
所以你必须按照那个顺序编写函数
template<typename ... ArgsOut, typename ...ArgsIn>
static std::tuple<ArgsOut...> convertTest(float nextArg, ArgsIn... remainingArgs);
并称之为
convertTest<int, int>(0.5f, 10.11f);
顺便说一句,你可以简单地写成这样(删除你独占的事实float
)
template<typename ...Args>
auto convertTest(Args... args)
-> decltype(std::make_tuple(static_cast<int>(args)...))
{
return std::make_tuple(static_cast<int>(args)...)
}