是否可以拥有一个功能模板,该模板将std::array<char,N>
并返回 char array[] = "string literal";
等效于
mkstemp
我正在包装POSIX API,我希望有一个std::pair<
ModifiedLiteral //template turned into actual name (probably in std::array)
,FileFd_RW //My fd wrapper
>;
函数模板,它将获取字符串文字并返回
a && a();
不使用堆。
答案 0 :(得分:6)
是的,你可以:
#include <array>
#include <functional>
#include <cstddef>
template <std::size_t N> std::array<char, N> parse_literal(const char (&lit)[N]) {
std::array<char, N> arr;
std::copy(lit, lit + N, arr.begin());
return arr;
}
void foo() {
parse_literal("This is my rifle, this is my gun");
}
答案 1 :(得分:6)
如果您的编译器支持C ++ 14,您可以使用std::index_sequence
来创建一个在编译时复制字符串文字的机制:
template<std::size_t N, std::size_t... I>
constexpr
std::array<char, N>
a2t_impl(char const (&str)[N], std::index_sequence<I...>) {
return {str[I]...};
}
template<std::size_t N, typename Indices = std::make_index_sequence<N>>
constexpr
std::array<char, N>
a2t(char const (&str)[N]) {
return a2t_impl(str, Indices());
}
template<std::size_t N>
constexpr
std::array<char, N>
stringtoarray(char const (&str)[N]) {
return a2t(str);
}