用于"runtime variadic template"的重载逗号运算符
Overload comma operator for "runtime variadic template"
我有一个计算图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);
}
- 使用C++中的模板和运算符重载执行矩阵运算
- 为什么这个运算符<重载函数对 STL 算法不可见?
- <T> 通过模板化运算符重载将 std::complex 乘以双倍
- C++20概念:需要运算符重载
- 使用赋值运算符重载从类中返回jobject
- 在运算符重载定义中使用成员函数(const错误)
- 字节到位运算符重载C++
- 为什么在运算符重载时需要参考?
- 类中 c++ 的运算符 + 重载
- 算术复合运算符重载为非成员
- 运算符重载 (+),用于添加两个具有 C++ 的数组
- 交换运算符 + 重载会导致无限递归
- 如何理解新的运算符重载?
- 向量保持复数的运算符重载
- 如何创建运算符重载?
- 链接列表运算符重载没有打印出我想要的内容
- C++:需要帮助了解运算符重载错误
- 使用模板化运算符重载 XOR 运算符失败
- 如何确保接受的C++模板类型使运算符重载?
- 运算符重载使用运算符+添加类模板