我正在尝试创建一个只应该暂时存在的类。我正在使用它来创建一个类似于函数的部分应用程序的接口。这是我正在尝试做的一个愚蠢的例子。
struct Adder {
explicit Adder(const int &leftOp)
: leftOp(leftOp) {}
int add(const int rightOp) const {
return leftOp + rightOp;
}
//note that addTwice calls add
int addTwice(const int rightOp) const {
return add(rightOp) + add(rightOp);
}
private:
const int &leftOp;
};
struct Calculator {
explicit Calculator(const int leftOp)
: leftOp(leftOp) {}
Adder add() const {
return Adder(leftOp);
}
void setLeftOp(const int newLeftOp) {
leftOp = newLeftOp;
}
private:
int leftOp;
};
计算器就像这样使用。
Calculator myCalculator(4);
const int myNum = myCalculator.add().add(5);
std::cout << myNum << '\n'; // 9
我想限制Adder
的界面,以便只能按上述方式调用它。我希望编译器阻止用户在变量中存储Adder
。
auto myCalcPtr = std::make_unique<Calculator>(4);
const Adder adder = myCalcPtr->add();
myCalcPtr.reset();
//oh dear. Adder has a dangling reference to a member in Calculator
const int myNum = adder.add(5);
我的想法是将Adder::add
和Adder::addTwice
标记为&&
,如此
int add(const int rightOp) && {
return leftOp + rightOp;
}
int addTwice(const in rightOp) && {
return add(rightOp) + add(rightOp);
}
但我在Adder::addTwice
中遇到了编译器错误。错误是
No matching member function for call to `add`
Candidate function not viable: 'this' argument has type 'const Adder' but method is not marked const
所以我添加了两个函数const &&
,如此
int add(const int rightOp) const && {
return leftOp + rightOp;
}
int addTwice(const in rightOp) const && {
return add(rightOp) + add(rightOp);
}
但仍然遇到同样的错误然后我来到stackoverflow并询问
如何强制Adder的所有实例始终是一个临时的?
我的实际问题比上面的例子复杂得多。我不是一个问初学者的初学者!