Объединение строковых литералов во время компиляции
Мне нужно объединить переменное количество строковых литералов в один, чтобы использовать его в static_assert()
Я пробовал использовать шаблоны со структурами, но компилятору не нравятся литералы в качестве параметров шаблона.
error: the address of ‘m1’ is not a valid template argument because it does not have static storage duration.
error: ‘"thre"’ is not a valid template argument for type ‘const char*’ because string literals can never be used in this context
Я тоже пробовал идеальную переадресацию, но получаю сообщение об ошибке:
‘args#0’ is not a constant expression
template<size_t size>
constexpr size_t const_strssize(const char (&)[size]) {
return size;
}
template<class... Ts>
constexpr size_t const_strssize(Ts&&... args) {
return const_sum<(const_strssize(std::forward<const Ts>(args)), ...)>::get;
}
Просто чтобы уточнить, я не могу
"string1" "string2"
потому что некоторые строки, которые я получаю от функций, возвращаются.
Пожалуйста, не советуйте такие вещи, как strlen или memcpy. Я знаю, их можно вычислить во время компиляции.
1 ответ
static_assert()
указан для приема строкового литерала. Любая функция constexpr, которую вы можете написать, может возвращать константу, но не литерал. Таким образом, вы можете использовать препроцессор только для построения строк для
static_assert
. Извините.