gpt4 book ai didi

c++11 - 编译时文字字符串作为模板参数

转载 作者:行者123 更新时间:2023-12-04 21:36:54 39 4
gpt4 key购买 nike

我正在尝试将 C++ 文字字符串转换为以下模板的实例:

template <char ... C>
struct string_literal {
typedef string_constant type;
static constexpr const char value[sizeof...(C)] = {C...};
constexpr operator const char* (void) const {
return value;
}
};
template <char ... C>
constexpr const char string_literal<C...>::value[sizeof...(C)];

我根据各种来源提出了这些帮助程序,用于将引用的字符串值“解包”到上面的模板中。
template <unsigned N, const char (&S) [N], typename U>
struct selector;

template <unsigned N, const char (&S) [N], unsigned ...I>
struct selector<N, S, index_sequence<I...>> {
using type = string_literal<S[I]...>;
};

template <unsigned N, const char (&S) [N]>
struct unpack {
using type = typename selector<N, S, make_index_sequence<N>>::type;
};

但是,当调用它时,我收到编译器错误:
template <unsigned N>
constexpr auto make_string_literal(const char (&s) [N]) {
return unpack<N, s>{}; // Error here
}

constexpr auto literal = make_string_literal("test");
// string_literal<'t','e','s','t','\0'>

GCC 4.9+ 报告:
错误:'const char (& s)[1]' 不是类型 'const char (&)[1]' 的有效模板参数,因为引用变量没有常量地址

Clang 3.7.1 报告:
错误:非类型模板参数引用没有链接的对象“s”

我尝试了几种不同的方法,但错误大多相同。
我在这里缺少什么?

最佳答案

这是满足您需求的令人满意的解决方案吗?

template <char ... C>
struct string_literal {
static constexpr const char value[sizeof...(C)] = {C...};
constexpr operator const char* (void) const {
return value;
}
void foo() {std::cout << value << '\n';}
};
template <char ... C> constexpr const char string_literal<C...>::value[sizeof...(C)];

template <typename CharT, CharT... Cs>
constexpr string_literal<Cs...> operator ""_create() {
return {};
}

int main() {
string_literal<'t','e','s','t'> s = "test"_create;
std::cout << s << '\n'; // test
s.foo(); // test
}

关于c++11 - 编译时文字字符串作为模板参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35666631/

39 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com