Мне нужно вычислить произведение кучки чисел во время компиляции, отправленное в шаблонную структуру. Мне удалось сделать некрасиво решение:template Metaprogramming: умножая кучу аргументов шаблона
template<std::size_t n1, std::size_t ...args>
struct mul_all
{
static constexpr std::size_t value = n1 * mul_all<args...>;
};
template<>
struct mul_all<0>
{
static constexpr std::size_t value = 1;
};
Проблема заключается в том, что каждый раз, когда я должен кормить 0 до шаблонных аргументов моей структуры, как так
int main()
{
std::cout << mul_all<1,2,5,4,5,7,0>::value << " "
<< mul_all<4,2,0>::value;
return 0;
}
есть ли какое-либо обходное решение, чтобы прочитать этот последний ноль?
примечание: я новичок в TMP.
Просто для Пинки, вот C + +14 'constexpr' решение, которое не использует рекурсию шаблона: http://melpon.org/wandbox/permlink/yNbfyOhiN3hLqmpA – bogdan
cool !!! есть ли способ сравнить его с другим решением? –
Вы имеете в виду время компиляции? Рекуррентные решения должны быть примерно одинаковыми и лучше, чем классические с рекурсией шаблонов, поскольку рекурсивные производят несколько экземпляров шаблонов, которые стоят что-то (на практике это начинает иметь значение при относительно большом числе аргументов шаблона - многие десятки из них). Однако решение Dummy массива C++ 14 является всего лишь обходным решением для отсутствия складчатых выражений; Я бы выбрал C++ 17-кратные выражения всякий раз, когда они доступны. – bogdan