我想做以下,但不知道为什么它没有在 C++17 中编译。
只是因为
auto funcs(int... as) {
return make_tuple(func(as)...);
}
不是 C++ 语法。
我认为
template <typename Args>
auto funcs (Args ... as)
{ return std::make_tuple(func(as)...); }
考虑到每个返回int 的as... 调用func() 是一个合理的解决方案。
但如果你真的想要一个类似于可变参数的函数,它接受可变参数 int(并且如果你可以设置参数数量的上限),我建议以下解决方案。
首先,您需要一个接收类型和std::size_t 并返回类型的模板;像
template <typename T, std::size_t>
using typer = T;
现在是具有自继承的辅助递归 struct
template <typename>
struct bar;
template <>
struct bar<std::index_sequence<>>
{
static void f () {}
};
template <std::size_t ... Is>
struct bar<std::index_sequence<Is...>>
: public bar<std::make_index_sequence<sizeof...(Is)-1U>>
{
using bar<std::make_index_sequence<sizeof...(Is)-1U>>::f;
static auto f (typer<int, Is>... as)
{ return std::make_tuple(func(as)...); }
};
使用static 方法定义barstructs 的序列,f 接收一些int(typer<int, Is> 是int)。
现在是struct foo
template <std::size_t N = 64U>
struct foo : public bar<std::make_index_sequence<N>>
{ };
从barstructs 的序列继承并继承f() 的序列,接收零、1、2、...、N-1 ints。
现在你可以打电话了
auto [v1, v2, v3] = foo<>::f(1, 2, 3);
因为在foo struct 中(也)有一个f() 方法可以接收三个ints。
以下是一个完整的工作示例
#include <tuple>
#include <iostream>
#include <type_traits>
int func(int a)
{ return a+1; }
template <typename T, std::size_t>
using typer = T;
template <typename>
struct bar;
template <>
struct bar<std::index_sequence<>>
{
static void f () {}
};
template <std::size_t ... Is>
struct bar<std::index_sequence<Is...>>
: public bar<std::make_index_sequence<sizeof...(Is)-1U>>
{
using bar<std::make_index_sequence<sizeof...(Is)-1U>>::f;
static auto f (typer<int, Is>... as)
{ return std::make_tuple(func(as)...); }
};
template <std::size_t N = 64U>
struct foo : public bar<std::make_index_sequence<N>>
{ };
int main ()
{
auto [v1, v2, v3] = foo<>::f(1, 2, 3);
std::cout << v1 << ", " << v2 << ", " << v3 << std::endl;
}