2016-02-12 1 views
1

Можно ли иметь шаблон функции, которая будет взять "string literal" и возвращал std::array<char,N> эквивалентношаблон функции, чтобы превратить строку буквального в станд :: массив

char array[] = "string literal"; 

?

Я оберточной POSIX API, и я хотел бы иметь шаблон mkstemp функцию, которая будет принимать строку буквальным и вернуть

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

без использования кучи.

+1

Что случилось с 'std :: string'? –

+1

@BoPersson, производительность? – SergeyA

ответ

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

Я бы использовал 'std :: size_t' вместо' int' для параметра шаблона. – NathanOliver

+0

@NathanOliver, так я бы тоже. Я созерцаю его редактирование :) - Готово. Однако различие чисто академическое. Я не могу представить себе строковый литерал более 4 ГБ :) – SergeyA

+0

@NathanOliver Почему? Существуют ли даже системы, которые поддерживают большие объекты стека? – PSkocik

5

Если ваш компилятор поддерживает 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); 
} 

Live Demo

+0

И если это не так, не так сложно сделать это самостоятельно. – SergeyA

Смежные вопросы