我有一个计算图g,需要一定数量的"变量"参数(在运行时定义) 我希望能像这样的函数一样使用这个图:
auto a = g(x, y);
但由于参数的数量是在运行时定义的,因此无法实现 我将不得不更改函数,因此它接受一个Variable的向量,可能会执行以下操作:
auto a = g({x, y});
但这不是非常用户友好所以我认为我可以重载一个Variable运算符,所以它会自动生成一个列表并使用它:
auto a = g(x + y);
//or
auto a = g(x ^ y);
//or
auto a = g(x && y);
但那会更令人困惑。 然后我发现有一个可以重载的逗号运算符
auto a = g(x, y);
编辑1
尝试更明确的解释: g()可以采用可变数量的参数,但这个数字仅在运行时定义(参数都是#34;变量") 这在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) );
否则会出现编译错误:参数太多
/ EDIT
在我开始尝试实现它之前,似乎太好了,是不是真的,首先是可能的? 它似乎有点&#34; hacky&#34;这是一个很好的做法吗?还是有更好的选择?我看到其他方法可以做这种事情,但使用可变参数模板和boost :: any ...它们通常要复杂10倍。
答案 0 :(得分:0)
如果你想要重载的逗号并得到一些未定义的数字参数,那么这是不可能的,只有在编译时才能使用元编程。
您可以尝试选择用户他想要的内容(数据)并使用特殊方法(用于类型数据),然后添加到
std::vector<boost::any> v {a, b, c}
如果您想在一个容器中添加大量参数和其他类型,可以使用std::vector<boost::any>
,稍后再将其g()
您也可以看到enter link description here
如何从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(在评论中休息)
答案 1 :(得分:0)
我不确定这是否是您要做的事情,但您可以使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);
}