Статическая проверка const char * содержит пробелы - PullRequest
0 голосов
/ 30 июня 2010

Есть ли способ проверить (утвердить) во время компиляции, если const char * содержит пробелы или нет?

Что-то вроде:

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

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

Тип такой же, номожет быть возможно определить некоторую хитрую технику метапрограммирования шаблонов, чтобы сделать это.

Дело в том, что вся необходимая информация исправлена ​​во время компиляции.

Эта проблема должна быть связана с проблемой «От переменной константного типа к типу», которую, я думаю, можно решить с помощью компиляции.время хэширования с помощью методов метапрограммирования.

Заранее благодарим за помощь.

Ответы [ 4 ]

4 голосов
/ 30 июня 2010

Вы не можете использовать обычные строки, так как их символы не доступны шаблонам, но вы можете использовать строки 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();

Вторая строка не компилируется.

2 голосов
/ 30 июня 2010

Я так не думаю.Если бы это было возможно, как компилятору удалось бы проверить это во время компиляции?

const char* cstr3 = some_dynamic_function();

check( cstr3 );
2 голосов
/ 30 июня 2010

Проблема в том, что вы не знаете 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";

Новое назначение не будет выполнено во время компиляции. Даже если вы использовали этот подход, я не думаю, что есть возможность оценить содержание константы во время компиляции.

1 голос
/ 30 июня 2010

Напишите скрипт, который проверяет строковые литералы, которые вас интересуют, и завершается неудачей, если у любого из них есть пробелы.

Запустите этот скрипт во время процесса сборки.

Добейтесь успеха своегоПроцесс сборки зависит от успеха сценария.

...