如何防止大括号初始值设定项在函数重载中被解释为整数?

Par*_*dox 1 c++ overloading

我有一个Expression存储代数术语的类。我希望它拥有的公共接口是这样的:

expr.add({1})      // add term "x1".         (error: code adds constant 1)
expr.add({0,1})    // add term "x0 * x1".
expr.add({0},2)    // add term "2 * x0"
expr.add(2)        // add constant 2
Run Code Online (Sandbox Code Playgroud)

但是我遇到的问题expr.add({1})是被解释为添加整数 1,而不是添加包含 1 的向量。有什么办法可以修复下面的实现以允许上面的接口?(或者至少抓住它?)因为打字expr.add(std::vector({1}))太冗长了。

#include <tuple>
#include <vector>
#include <unordered_set>
#include <iostream>

class Expression
{
    using var_t = unsigned int;
    using term_t = std::pair<int, std::vector<var_t>>;

    std::vector<term_t> terms;

  public:

    void add(const std::vector<var_t>& vars, int coeff=1)
    {
        std::cout << "Adding a term" << std::endl;
        terms.push_back(std::make_pair(coeff, vars));
    }
    void add(int constant)
    {
        std::cout << "Adding a constant" << std::endl;
        terms.push_back(std::make_pair(constant, std::vector<var_t>{}));
    }
};

int main()
{
    Expression expr;
    expr.add({1},1); // "Adding a term"
    expr.add({1});   // "Adding a constant"
    expr.add(1);     // "Adding a constant"
}
Run Code Online (Sandbox Code Playgroud)

cig*_*ien 5

您可以添加一个重载,initializer_list如果它在大括号初始值设定项中,则该重载将绑定到参数

void add(std::initializer_list<var_t> vars, int coeff=1)
{
    add(std::vector<var_t>(vars), coeff);
}
Run Code Online (Sandbox Code Playgroud)

在实现中,您可以只vector显式调用重载和/或向用户发出警告。

这是一个演示