pan*_*an- 10 c++ arrays pointers
我希望能够在重载分辨率中区分数组和指针:
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
}
Run Code Online (Sandbox Code Playgroud)
到目前为止我发现的最好的是使用指针的引用而不是指针:
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
}
Run Code Online (Sandbox Code Playgroud)
这不完全一样,我想知道是否存在更好的方法
Ben*_*igt 13
当两者都可行时,你需要使第一个过载成为较差的选择.目前它们与转换排名相关(两者都是"完全匹配"),然后由于非模板是首选,因此打破了平局.
这应该使转换排名更差:
struct stg
{
struct cvt { const char* p; cvt(const char* p_p) : p(p_p) {} };
// matches const char*, but disfavored in overload ranking
stg(cvt c_str); // use c_str.p inside :( Or add an implicit conversion
template<int N>
stg(const char (&str) [N]);
};
Run Code Online (Sandbox Code Playgroud)
您可以使用SFINAE.这可能不是最好的方法,但它应该可以正常工作:
//thanks to dyp for further reduction
template<typename T, typename = typename std::enable_if<std::is_same<T, char>::value>::type>
string(const T * const &) {std::cout << "const char *\n";}
template<std::size_t N> //credit to jrok for noticing the unnecessary SFINAE
string(const char(&)[N]) {std::cout << "const char(&)[" << N << "]\n";}
Run Code Online (Sandbox Code Playgroud)
这是一个实例.