我有一个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)
您可以添加一个重载,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显式调用重载和/或向用户发出警告。
这是一个演示。