静态检查const char *包含空格

时间:2010-06-30 17:52:24

标签: c++ templates metaprogramming

有没有办法在编译时检查(断言)const char *是否包含空格?

类似的东西:

const char* cstr1 = "ok";
const char* cstr2 = "very bad";

check( cstr1 ); //OK
check( cstr2 ); //Fail to compile

类型是相同的,但也可以定义一些棘手的模板元编程tecnique来做到这一点。

要点是,所需的所有信息都在编译时修复。

这个问题应该与“从const const char变量到类型”问题有关,我认为这可以通过元编程tecniques进行编译时散列来解决。

提前感谢您的帮助。

4 个答案:

答案 0 :(得分:4)

您不能使用普通字符串,因为模板无法访问它们的字符,但您可以使用MPL字符串:

#include <boost/mpl/char.hpp>
#include <boost/mpl/string.hpp>
#include <boost/mpl/contains.hpp>
#include <boost/utility/enable_if.hpp>

typedef boost::mpl::char_<' '> space;
typedef boost::mpl::string<'o', 'k'> cstr1;
typedef boost::mpl::string<'v', 'e', 'r', 'y', ' ', 'b', 'a', 'd'> cstr2;

boost::disable_if< boost::mpl::contains<cstr1, space> >::type check();
// boost::disable_if< boost::mpl::contains<cstr2, space> >::type check();

第二行无法编译。

答案 1 :(得分:2)

问题是你在编译时不知道cstr

int i = function_call();
const char* cstr = NULL;

if(i > 0)
{
   cstr = "hello";
}
else
{
   cstr = "ciaooo";
}

考虑上面的例子。编译器现在不会在运行时假定const char* cstr的值。

基本上我会说你不能在编译时进行这样的检查。

请注意,虽然声明为const,但这并不意味着变量cstr是常量。请注意,指针类型为const。你必须这样读:(const char)* cstr。这意味着您无法执行此类操作cstr[0] = 's';

纯粹的常量将被声明为:

const char * const CONSTANT = "test";

新的分配在编译时会失败。即使你使用这种方法,我也不认为有可能在编译时评估常量的内容。

答案 2 :(得分:2)

我不这么认为。如果可能的话,编译器如何设法在编译时检查它?

const char* cstr3 = some_dynamic_function();

check( cstr3 );

答案 3 :(得分:1)

编写一个脚本来检查你关心的字符串文字,如果它们中的任何一个有空格则会失败。

在构建过程中运行此脚本。

使构建过程的成功取决于脚本的成功。