重载#ma;运行时变量模板"

时间:2017-07-02 23:33:28

标签: c++ function parameters runtime operator-keyword

我有一个计算图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倍。

2 个答案:

答案 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);
}