【发布时间】:2018-02-24 22:46:13
【问题描述】:
我正在尝试检测何时调用了显式构造函数调用与隐式调用。
假设我们有一个类Foo:
class Foo{
public:
Foo(int _val) : val(_val){};
private:
int val;
}
void bar(Foo f){
...
}
我们可以这样调用bar:
Foo f(10);
bar(f);
或喜欢:
bar(10); // implicit initialization
现在,我知道如果我们明确 ctor:
class Foo{
public:
explicit Foo(int _val) : val(_val){};
private:
int val;
}
那么我们可以得到这个错误:
bar(10); // ERROR! implicit initialization not allowed.
所以我认为也许有一种解决方法来检测显式调用与隐式调用,如下所示:
class Foo{
public:
explicit Foo(int _val) : val(_val){}; // calling Foo f(10); bar(f);
Foo(int _val) : val(_val){}; // calling bar(10);
private:
int val;
}
但正如预期的那样,它返回“不能重载”,因为函数签名不明确。
最终结果应该是这样的:
class Foo{
public:
explicit Foo(int _val) : val(_val), flag(true) {}; // calling Foo f(10); bar(f);
Foo(int _val) : val(_val), flag(false) {}; // calling bar(10);
private:
int val;
bool flag;
}
void bar(Foo f){
std::cout << "f's flag set to : " << f.flag << std::endl;
}
Foo f(10);
bar(f); // f's flag set to : 1
bar(10); // f's flag set to : 0
但显然,由于上述尝试是徒劳的,而且我没有更好的主意,我想知道是否可以在 C++ 中做到这一点。如果不是,那也没关系。
【问题讨论】:
-
你认为你为什么需要这样做?
-
这听起来很像XY problem。如果您需要检测到这一点,则说明您的模型存在很大问题。
-
我不是在问是否应该这样做,我是在问是否可以这样做。这不是我到达我想要的地方的必要路径。
-
在您当前的情况下,您可以区分,因为显式构造函数也会进行复制,而隐式构造函数不会进行额外的复制。
-
顺便说一句,在您的评论中,“flag set to 1”放错了位置,应该是
f(10)。
标签: c++ class oop constructor explicit