c++ - 模板元编程 : multiplying a bunch of template arguments

标签 c++ templates template-meta-programming variadic

我需要在编译时计算传递给模板化结构的一堆数字的乘积。我成功地做了一个丑陋的解决方案:

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++17中,使用折叠表达式,你可以直接做

template<std::size_t ...args>
struct mul_all
{
    static constexpr std::size_t value = (args * ...);
};

之前,你必须做偏特化:

template<std::size_t n1, std::size_t ...args>
struct mul_all
{
    static constexpr std::size_t value = n1 * mul_all<args...>::value;
};

template<std::size_t n>
struct mul_all<n>
{
    static constexpr std::size_t value = n;
};

关于c++ - 模板元编程 : multiplying a bunch of template arguments,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41408719/

相关文章:

templates - 将 HTML 保存到 golang 模板变量

c++ - C++ 编译器是否为每个具有相同模板参数集的模板类实例生成代码?

c++ - 统一类型和非类型模板参数

c++ - 在 Windows 7 x64 上检测 DVD-RAM 介质是否为空

c++ - 为什么 operator<< 不适用于 operator- 返回的内容?

c++ - 一个编译单元中的静态初始化

c++ - 通过对常量的引用将元素传递给 lambda

c++ - QGraphicsItem只能在堆上创建?

C++控制台屏幕大小

c++ - std::get 从模板参数