2016-11-17 2 views
1

После долгого дня неудачного поиска в Интернете для практического решения, чтобы решить мою проблему, я решил разместить свой вопрос здесь, чтобы пояснить свою цель я предоставил этот простой код:Получение размера каждого типа пакета параметров?

template<typename... types> 
    std::vector<SIZE_T> GetTypesSize() 
    { 
     std::vector<SIZE_T> typesSizeContainer; 
     typesSizeContainer.reserve(sizeof... (types)); 

     /* 
     * What I want here is a mechanism to loop throw 
     * each element of the parameter pack to get its size 
     * then push it into typesSizeContainer. 
     * Something similar to : 
     * For(auto& element : types...) { 
     *  typesSizeContainer.push(sizeof(element)); 
     * } 
     * 
     */ 

     return std::move(typesSizeContainer); 
    } 

Когда я называю это шаблон функции в этом коде:

// platform x86 
std::vector<SIZE_T> tempVactor; 
tempVactor = GetTypesSize<char, short, int>(); 

элементы tempVactor должны быть { 1, 2, 4 }.

Любое предложение или решение значительны.

ответ

2

Я бы рекомендовал использовать std::array для этого:

template<typename... Types> 
constexpr auto GetTypesSize() { 
    return std::array<std::size_t, sizeof...(Types)>{sizeof(Types)...}; 
} 
+0

As @ W.F. Упомянутый ответ был предоставлен практическим решением, которое я искал, я благодарен. –

+0

Отличный пример 'sizeof' и' sizeof ... ', используемых в одной строке кода. – Bernard

5

Вы можете просто инициализировать вектор с распакованных размеров:

template<typename... types> 
std::vector<size_t> GetTypesSize() 
{ 
    return { sizeof(types)... }; 
} 

demo

+0

Я ценю вашу помощь. –

+2

@AmraneAbdelkader также рассмотреть возможность изменения результата Тип в массив (он имеет время компиляции известного размера), это позволило бы функции constexpr ... –

+0

@ W.F. Правильно, это важный момент для вашего предложения. –

1

Существует еще одно возможное решение, которое показывает, как для решения проблемы с использованием SFINAE:

template<size_t N> 
typename std::enable_if<N == 0>::type get(std::vector<std::size_t>& sizes) {} 

template<size_t N, typename T, typename... Args> 
typename std::enable_if<N != 0>::type get(std::vector<std::size_t>& sizes) { 
    sizes.push_back(sizeof(T)); 
    get<N - 1, Args...>(sizes); 
} 

template<typename... Args> 
const std::vector<std::size_t> get() { 
    std::vector<std::size_t> sizes; 
    get<sizeof...(Args), Args...>(sizes); 
    return sizes; 
} 
+0

Rokyan Всегда приятно видеть такие альтернативные решения, потрясающие. –

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