Сообщение Некорректное поведение Intel Compiler C++ от 23.11.2017 22:01
Изменено 23.11.2017 22:04 Constructor
Re: Некорректное поведение Intel Compiler C++
Здравствуйте, niXman, Вы писали:
X>есть функция, аргументы которой могут быть только фундаментальными типами.
X>хочу подсчитать суммарный размер всех аргументов этой функции.
X>...
X>как победить? можно использовать С++11. (про fold expression знаю...)
Fold expression из C++17 легко сэмулировать на C++11/C++14. Однако в C++11 constexpr-функции могут быть только однострочниками, поэтому следующий код компилируется исключительно в C++14 (и выше):
Другой вариант решения на чистом C++11 (отличный от представленного
X>есть функция, аргументы которой могут быть только фундаментальными типами.
X>хочу подсчитать суммарный размер всех аргументов этой функции.
X>...
X>как победить? можно использовать С++11. (про fold expression знаю...)
Fold expression из C++17 легко сэмулировать на C++11/C++14. Однако в C++11 constexpr-функции могут быть только однострочниками, поэтому следующий код компилируется исключительно в C++14 (и выше):
template <typename... Args>
constexpr std::uint8_t size_of_args(const Args&...)
{
using Do = int[];
std::uint8_t size{};
(void)Do{0, (size += sizeof(Args), 0)...};
return size;
}
Другой вариант решения на чистом C++11 (отличный от представленного
Автор: watchmaker
Дата: 26.10.17
watchmaker) может использовать рекурсию шаблонов класса:Дата: 26.10.17
template <typename...>
struct size_of;
template <>
struct size_of<>
{
static constexpr std::uint8_t value{};
};
template <typename Head, typename... Tail>
struct size_of<Head, Tail...>
{
static constexpr auto value = sizeof(Head) + size_of<Tail...>::value;
};
template <typename... Args>
constexpr std::uint8_t size_of_args(const Args&...)
{
return size_of<Args...>::value;
}
Некорректное поведение Intel Compiler C++
Здравствуйте, niXman, Вы писали:
X>есть функция, аргументы которой могут быть только фундаментальными типами.
X>хочу подсчитать суммарный размер всех аргументов этой функции.
X>...
X>как победить? можно использовать С++11. (про fold expression знаю...)
Fold expression из C++17 легко сэмулировать на C++11/C++14. Однако в C++11 constexpr-функции могут быть только однострочниками, поэтому следующий код компилируется исключительно в C++14 (и выше):
Другой вариант решения на чистом C++11 (отличный от представленного
X>есть функция, аргументы которой могут быть только фундаментальными типами.
X>хочу подсчитать суммарный размер всех аргументов этой функции.
X>...
X>как победить? можно использовать С++11. (про fold expression знаю...)
Fold expression из C++17 легко сэмулировать на C++11/C++14. Однако в C++11 constexpr-функции могут быть только однострочниками, поэтому следующий код компилируется исключительно в C++14 (и выше):
template <typename... Args>
constexpr std::uint8_t size_of_args(const Args&...)
{
using Do = int[];
std::uint8_t size{};
(void)Do{0, (size += sizeof(Args), 0)...};
return size;
}
Другой вариант решения на чистом C++11 (отличный от представленного
Автор: watchmaker
Дата: 26.10.17
watchmaker) может использовать рекурсию шаблонов класса:Дата: 26.10.17
template <typename...>
struct size_of;
template <>
struct size_of<>
{
static constexpr std::uint8_t value{};
};
template <typename Head, typename... Tail>
struct size_of<Head, Tail...>
{
static constexpr std::uint8_t value = sizeof(Head) + size_of<Tail...>::value;
};
template <typename... Args>
constexpr std::uint8_t size_of_args(const Args&...)
{
return size_of<Args...>::value;
}