将传递的参数限制为字符串文字

def*_*ode 5 c++ string-literals c++11

我有一个类来包装字符串文字并在编译时计算大小.

构造函数如下所示:

template< std::size_t N >
Literal( const char (&literal)[N] );

// used like this
Literal greet( "Hello World!" );
printf( "%s, length: %d", greet.c_str(), greet.size() );
Run Code Online (Sandbox Code Playgroud)

但是代码有问题.下面的代码编译,我想使它成为一个错误.

char broke[] = { 'a', 'b', 'c' };
Literal l( broke );
Run Code Online (Sandbox Code Playgroud)

有没有办法限制构造函数,使它只接受c字符串文字?编译时间检测是首选,但如果没有更好的方法,则可以接受运行时.

R. *_*des 8

有一种强制字符串文字参数的方法:创建用户定义的文字运算符.您可以让运算符constexpr在编译时获取大小:

constexpr Literal operator "" _suffix(char const* str, size_t len) {
    return Literal(chars, len);
}
Run Code Online (Sandbox Code Playgroud)

我不知道目前有任何编译器实现此功能.

  • 进一步试验,这里是没有宏的@Luc代码(虽然不再是UD文字函数的模拟):http://ideone.com/JF4cx (2认同)

iam*_*ind 6

是的。您可以使用以下预处理器生成编译时错误

#define IS_STRING_LITERAL(X) "" X ""
Run Code Online (Sandbox Code Playgroud)

如果您尝试传递字符串文字以外的任何内容,编译将失败。用法:

Literal greet(IS_STRING_LITERAL("Hello World!"));  // ok
Literal greet(IS_STRING_LITERAL(broke)); // error
Run Code Online (Sandbox Code Playgroud)

  • 当问题的全部目的是阻止人们成为坏公民时,该解决方案取决于每个人都是好公民。 (9认同)
  • `IS_STRING_LITERAL(+ (std::string))`。 (2认同)