如何找出函数中传递的参数是字符串还是字符(不确定如何正确调用)文字?
我的功能(不正确):
void check(const char* str)
{
// some code here
}
我想用:
来称呼它int main()
{
check("Hello"); // Correct call
std::string hello = "Hello";
check(hello.c_str()); // Must be compile error here
}
答案 0 :(得分:6)
对于这两种解决方案,我将check
函数重命名为check_impl
并将其包装。
仅靠编译器无法做到这一点,但我们可以近距离接触:
template <std::size_t N>
void check(char const (&str)[N]) {
return check_impl(str);
}
这只涉及const char
数组的引用,这些数组并不常见。但是你仍然可以传递一个命名数组而不是字符串文字。
进入预处理器:
#define check(str) check_impl("" str)
这个非常简单的宏只是在你的参数上添加一个空的文字右边。如果参数是另一个字符串文字,则编译器将合并它们,否则这将是语法错误。
答案 1 :(得分:2)
这件事可能会或可能不会做你想做的事情:
constexpr const char* check(const char* c) {
return c;
}
用法:
int main() {
constexpr auto result = check("test");
constexpr auto result2 = check(std::string("test").c_str()); // error
}
产生的错误消息是:
main.cpp:11:61: error: call to non-constexpr function 'const _CharT* std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::c_str() const [with _CharT = char; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>]'
constexpr auto result2 = check(std::string("test").c_str());
~~~~~~~~~~~~~~~~~~~~~~~~~^~
它的工作方式是不直接检查文字;而不是那样,它检查是否可以在编译时获得const char*
值,这可能更有意义,但不完全是你想要的。