用于将字符串文字转换为std :: array的函数模板

PSk*_*cik 1 c++ c++11

是否有可能有一个函数模板,它将获取"string literal"并返回std::array<char,N>等效的

 char array[] = "string literal";
Run Code Online (Sandbox Code Playgroud)

我正在包装POSIX API,我想要一个mkstemp函数模板,它将获取字符串文字并返回

std::pair<
 ModifiedLiteral //template turned into actual name (probably in std::array)
,FileFd_RW       //My fd wrapper
>;
Run Code Online (Sandbox Code Playgroud)

不使用堆.

Ser*_*eyA 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");
}
Run Code Online (Sandbox Code Playgroud)

  • @PSkocik主要是因为`std :: size_t`记录了这个意图,并且它是专门为此设计的,用它作为大小索引.如果你看一下[`std :: array`](http://en.cppreference.com/w/cpp/container/array),你会发现它使用`size_t`作为模板参数. (3认同)

101*_*010 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);
}
Run Code Online (Sandbox Code Playgroud)

现场演示