在编译时定义string / char文字

时间:2016-11-16 13:42:08

标签: c++

如何找出函数中传递的参数是字符串还是字符(不确定如何正确调用)文字?

我的功能(不正确):

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
}

2 个答案:

答案 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*值,这可能更有意义,但不完全是你想要的。