使用类成员作为成员函数的默认参数
Using a class member as a default argument for a member function
除了手动重载相应的成员函数并使用成员作为参数调用第一个重载之外,还有没有其他方法?
我正在尝试类似的东西
class test
{
string t1="test";
testfun( string& val = this->t1 )
{ /* modify val somehow */ }
};
(测试:http://goo.gl/36p4CF)
目前,我想没有技术原因说明这不应该起作用。
- 除了重载和手动设置参数之外,有没有解决方案可以做到这一点?
- 为什么这不起作用,是否有技术原因?
[dcl.fct.default]/8:
关键字
this
不得在成员函数的默认参数中使用。
这是一般问题的特例:不能在参数的默认参数中引用其他参数。 即
void f(int a, int b = a) {}
格式不正确。也是如此
class A
{
int j;
};
void f(A* this, int i = this->j) {}
这基本上是编译器将形式void f(int i = j) {}
的成员函数转换为的内容。这源于这样一个事实,即函数参数和后缀表达式(构成对象参数)的求值顺序未指定。[dcl.fct.default]/9:
每次调用函数时都会计算默认参数。 未指定函数参数的计算顺序。因此,函数的参数不应在默认值中使用 参数,即使它们没有被评估。
除了重载和手动设置参数之外,有没有解决方案可以做到这一点?
不,如果您希望默认参数依赖于另一个参数(包括 this
)。虽然,在这种情况下,它没有意义,因为这是一个构造函数,并且在调用它之前不存在t1
。
为什么这不起作用,是否有技术原因?
因为未指定函数参数的计算顺序。若要允许默认参数中的参数值,需要更复杂的规则来确保在使用之前初始化每个参数。
你还没有说你想要实现什么。 我假设您需要每个实例都以特定的方式做出反应,具体取决于某个类变量。
但是,如果您不需要每个实例的行为,则可以使用静态变量。以下作品:
#include <iostream>
using namespace std;
struct test {
static string t1;
void say(const string &val=t1){
cout << val << "!" << endl;
}
};
string test::t1;
int main() {
cout << "Hello World" << endl;
test::t1 = string("asd");
test a;
a.say();
a.say("bla");
test::t1 = string("blahblah");
a.say();
return 0;
}
。这意味着类test
的所有对象都将使用静态字符串t1
作为其默认值。
你可以"破解"一点,并将其用作丑陋的哨兵:
void say(const string &val=t1){
if (&val == &t1) {
// They are using the default value, so act as you want
} else {
// they are providing a value
}
}
相关文章:
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 基类中的默认析构函数禁用子类中的移动构造函数(如果有成员)
- C++向量默认为成员参数
- 在 C++ 中声明 const 对象需要用户定义的默认构造函数.如果我有一个可变成员变量,为什么不呢?
- 强制使用默认构造函数对成员进行未初始化的声明
- 在 C++ 中,默认情况下构造函数为类的数据成员提供的值是多少?
- 用作默认参数的静态成员会导致无法解析的外部
- 为什么在使用指针时不采用类成员的默认值,而不是直接实例化对象时?
- 具有外部定义的默认特殊成员函数
- C++中未初始化成员布尔变量的默认值是多少?
- 两个成员,在Base中默认初始化,可能在Derived中非默认初始化
- 声明成员对象而不调用其默认构造函数
- 将私有数据成员作为默认参数传递给该类的公共方法时出错
- 结构中的默认成员值或默认构造函数参数
- C++11 默认类成员初始化与初始值设定项列表同时
- POD成员默认初始化无括号
- 初始化类成员 - 默认值还是成员初始化列表?
- 具有类成员默认值的 C++11 默认构造函数行为
- 模板成员默认初始化
- 类 POD 成员默认初始化与零初始化与无初始化