【发布时间】:2014-02-23 18:36:19
【问题描述】:
我希望能够在重载解析中区分数组和指针:
class string {
public:
string(const char* c_str);
template<int N>
string(const char (&str) [N]);
};
int main() {
const char* c_str = "foo";
string foo(c_str); // ok will call string(const char*)
string bar("bar"); // call string(const char*) instead of the array version
}
到目前为止我发现的最好的方法是使用对指针的引用而不是指针:
class string {
public:
string(const char*& c_str);
template<int N>
string(const char (&str) [N]);
};
int main() {
const char* c_str = "foo";
string foo(c_str); // ok will call string(const char*)
string bar("bar"); // ok, will call the array version
}
这不完全一样,我想知道是否存在更好的方法
【问题讨论】:
-
您为什么期望调用之间存在差异,以及您打算使用这种(不存在的)副作用是什么?顺便说一句,在专用命名空间之外命名一个类
string会带来麻烦。 -
我预计会有所不同,因为当我调用
string bar("bar")时,我不传递指针而是传递数组,这就是指向指针衰减的数组开始,我想获得数组的大小在编译时,如果可用,memcpy远好于strcpy。否则,此类具有正确的命名空间 ofc,为了清楚起见,我将其删除。 -
如果数组是静态的我可以,尝试第二个sn-p代码,你会看到,带有模板数组参数的构造函数在第二次调用(
string bar("bar"))时被调用。我想要的是一种更好的方法来区分数组中的指针。 -
init函数可以吗?我不确定如何使用构造函数。 -
使用构造函数会更好,但知道如何做总是好的:)