Я пытаюсь создать класс строки времени компиляции. Я взял несколько советов от this post. К сожалению, я застрял в предшествующем перегрузке конструктора: конструктор const char[]
игнорируется в пользу конструктора const char*
. Любые советы будут оценены!Строки времени компиляции: приоритет перегрузки конструктора между `const char *`/`const char []`
class string {
public:
// Can be done compile time. Works lovely! except...
template<size_t N>
constexpr string(const char(&char_array)[N])
: ptr_(char_array), length_(N-1) {}
// This override gets called instead. I *must* keep this constructor.
string(const char* const str)
: ptr_(str) {
length_ = strlen(str);
}
// Ugly hack. (not acceptable)
template<size_t N>
constexpr string(const char(&char_array)[N], double unused)
: ptr_(char_array), length_(N-1) {}
private:
const char* ptr_;
int length_;
};
constexpr const char kConstant[] = "FooBarBaz";
constexpr string kString(kConstant); // Error: constexpr variable 'kString' must be initialized by a constant expression (tries to call wrong overload)
constexpr string kString(kConstant, 1.0f); // ugly hack works.
Есть много классных вещей, которые я могу сделать, если я могу сделать константы строки компиляции.
- тестирования строки равенства быстрее, чем
string
const char *
- Исключите время выполнения накладных расходы неявных преобразований из
const char *
вstring
, которые требуютstrlen()
на постоянная время компиляции строк. - Compile времени струнные комплекты, которые делают равенство тестирование вместо хэширования для размера < N. (это несколько процессоров накладных расходов на одного приложения Я смотрю на)
Если вы посмотрите на [ 'станд :: string' конструктор перегрузках] (http://en.cppreference.com/w/cpp/string/basic_string/basic_string) вы увидите, что они не делают даже беспокоиться с массивами, только указатели. –
Они также не поддерживают конструкцию constexpr! В этом-то и дело. Шаблонный массив символов способен определять размер строки во время компиляции. –
Функция без шаблонов имеет предпочтение по сравнению с шаблонами, даже если для этого требуется распад указателя. Однако я не знаю, как это исправить. У меня была та же проблема, когда я это пробовал, и, наконец, остановился на строках, основанных на вариационных шаблонах. – SergeyA