Объединение строковых литералов во время компиляции

Мне нужно объединить переменное количество строковых литералов в один, чтобы использовать его в 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. Извините.

Другие вопросы по тегам