【发布时间】:2017-11-29 09:06:46
【问题描述】:
我有一个类来包装字符串文字并在编译时计算大小。
构造函数如下所示:
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() );
但是代码有问题。以下代码编译,我想把它变成一个错误。
char broke[] = { 'a', 'b', 'c' };
Literal l( broke );
有没有办法限制构造函数,使其只接受 c 字符串文字?编译时检测是首选,但如果没有更好的方法,运行时也是可以接受的。
【问题讨论】:
-
@Nawaz 特别提到了 C 字符串文字的问题。我认为这样提及是恰当的。
-
c 标签可能不合适。走着瞧。我希望有人会使用 c++11 的新功能(
constexpr、可变参数等)来解决这个问题。 -
只在运行时设置大小会不会损失太大?尽管如此,我还是会发布一个答案。
-
@JaredPar:C 字符串文字不仅是 C 字符串文字,它们也是 C++ 字符串文字。事实上,没有什么叫做 C 字符串文字。只有字符串文字,碰巧在两种语言中都有!
-
@Nawaz 我意识到 c 风格的字符串文字在两种语言中都可用。鉴于 C++11 标记和明确提及 c 样式字符串文字,我认为 C++11 中可能有一个与 c 样式字符串不同的新功能(对于 C++11 功能列表不是最新的) ) 因此我添加了标签。它已被删除,所以不用担心。
标签: c++ c++11 string-literals