用于"runtime variadic template"的重载逗号运算符

Overload comma operator for "runtime variadic template"

本文关键字:运算符 重载 template runtime variadic 用于      更新时间:2023-10-16

我有一个计算图g,它接受一定数量的"变量"参数(在运行时定义( 我希望能够像以下函数一样使用这个图:

auto a = g(x, y);

但这是不可能的,因为参数的数量是在运行时定义的 我将不得不更改函数,以便它接受变量向量,并可能执行以下操作:

auto a = g({x, y});

但这不是很用户友好,所以我认为我可以重载变量的运算符,这样它就会自动制作一个列表并像这样使用它:

auto a = g(x + y); 
//or
auto a = g(x ^ y); 
//or
auto a = g(x && y);

但那会更加令人困惑。 然后我发现有一个逗号运算符可以重载

auto a = g(x, y);

编辑 1

试图更清晰的解释: g(( 可以接受可变数量的参数,但这个数字仅在运行时定义(参数类型均为"变量"( 这在C++是不可能的,这就是为什么我想"模拟"它: g(( 实际上会接受"变量"的向量作为输入,我想重载逗号运算符,以便它将"变量"打包到一个向量中

编辑 2

我在Boost.Assign 中找到了一个例子:

vector<int> v; 
v += 1,2,3,4,5,6,7,8,9;

逗号被重载,因此其工作方式类似于 {1,2,3,4,5,6,7,8,9}

编辑 3

我试图实现它,但由于运算符的优先级,它不像我想要的那样工作:你必须写

auto a = g( (A, B, C) );

否则你会得到一个编译器错误:参数太多

/编辑

在我开始尝试实施它之前,这似乎好得令人难以置信,这甚至可能吗? 这似乎有点"黑客",这是一种好的做法吗?还是有更好的选择?

我看到了其他做这种事情的方法,但它们通常比使用可变参数模板和 boost::any

...

如果你想要重载的逗号并得到一些未定义的数字参数,所以这是不可能的,唯一的方法是在编译时使用元编程。

您可以尝试选择用户想要给出的内容(数据(并使用特殊方法(对于类型数据(,然后添加到std::vector<boost::any> v {a, b, c}

如果你想在一个容器中有很多参数和其他类型,你可以使用std::vector<boost::any>,稍后给他g()

您也可以在此处查看输入链接说明

如何显示来自 Boost::any 的元素。

C++17 中的版本

std::vector<std::experimental::fundamentals_v1::any> v {10, 5.5, "HEY", 4.4}

带提升库

std::vector<boost::any> v {1, 5.5, "HEY"}

不可能生成参数确定的函数调用 在运行时..... ~DeiDei (在评论中休息(

我不太确定这是否是您要做的,但您可以g一个具有专门用于std::vector<Variable>的可变参数模板。 可变参数版本只是将参数打包在一个向量中并调用专用化。

#include <iostream>
#include <vector>
using Variable = int;
template < typename ... Args >
int g(Args ... args)
{
return g(std::vector<Variable>{args...});
}
template < >
int g(std::vector<Variable> v)
{
// do something with v
for (auto const& p : v)
std::cout << p << 'n';
return 0;
}

int main()
{
auto a = g(1,2,3);
}