2016-02-16 2 views
4

В C++ 11 можно получить agregated размер аргументов таким образом:VARIADIC размер аргумента шаблона (не в счет)

template<typename First, typename... Rest> 
size_t getSize(const First& first, const Rest& ...rest) 
{ 
    return getSize(first) + getSize(rest...); 
} 

template <typename T> 
size_t getSize(const T&) 
{ 
    return sizeof(T); 
} 


std::cout << "Size of arguments is: " << getSize(short(0), double(0.0)) << std::endl; 

выход будет: «Размер аргументов: 10». Есть ли аналогия для старого C++?

P.S. Лучшее решение для C++ 11 также приветствуется

+7

В C++ 17 вы можете сказать '(SizeOf (Args) + ... + 0) ':-) –

+2

Я не вижу никакой потенциальной реализации для pre-C++ 11, кроме faux variadic templates: создайте много перегрузок, беря от одного до N аргументов, где N достаточно велико –

+0

@KerrekSB Я боюсь C++ 17 - это не так, но спасибо – Jeka

ответ

4

Для C++ 11 я бы использовал это, которое оценивается временем компиляции.

#include <iostream> 

template<typename First, typename... Rest> 
struct total_size_of 
{ 
    static constexpr size_t value = total_size_of<First>::value + total_size_of<Rest...>::value; 
}; 

template <typename T> 
struct total_size_of<T> 
{ 
    static constexpr size_t value = sizeof(T); 
}; 

int main() { 
    std::cout << "Size of arguments is: " << total_size_of<short, double>::value << std::endl; 
    return 0; 
} 

Для Pre-C++ 11 Я хотел бы использовать что-то вроде этого (из-за отсутствие шаблонов переменного числа).

#include <iostream> 


template <typename T> 
struct custom_size_of 
{ 
    static const size_t value = sizeof(T); 
}; 

template <> 
struct custom_size_of<void> 
{ 
    static const size_t value = 0; 
}; 

template <typename One, typename Two = void, typename Three = void, typename Four = void> 
struct total_size_of 
{ 
    static const size_t value = custom_size_of<One>::value + custom_size_of<Two>::value + custom_size_of<Three>::value + custom_size_of<Four>::value; 
}; 


int main() 
{ 
    std::cout << "Size of arguments is: " << total_size_of<short, double>::value << std::endl; 
    return 0; 
} 

Хотя версия C++ 11 по-прежнему легко настраивается в функцию, которая автоматически определяет типы параметров, не существует хорошее решение сделать это с предварительно C++.

C++ 11:

template <typename...Args> 
size_t get_size_of(Args...args) 
{ 
    return total_size_of<Args...>::value; 
} 

Pre-C++ 11:

template <typename One> 
static size_t get_size_of(const One&) 
{ 
    return total_size_of<One>::value; 
} 
template <typename One, typename Two> 
static size_t get_size_of(const One&, const Two&) 
{ 
    return total_size_of<One, Two>::value; 
} 
template <typename One, typename Two, typename Three> 
static size_t get_size_of(const One&, const Two&, const Three&) 
{ 
    return total_size_of<One, Two, Three>::value; 
} 
template <typename One, typename Two, typename Three, typename Four> 
static size_t get_size_of(const One&, const Two&, const Three&, const Four&) 
{ 
    return total_size_of<One, Two, Three, Four>::value; 
}