计算可变参数模板的函数

mav*_*vam 3 c++ variadic-functions variadic-templates constexpr c++11

我试图弄清楚哪种是在变量类型列表上实现函数的最惯用的方式.例如,计算所有类型的最大大小.我知道有几种方法可以完成这样的任务,但我想知道何时选择哪种策略.

这些是我会考虑的机制(可能存在更多,如果是这样,请提及):

  • 输入特征(理想情况下使用声明):

    template <typename Head>
    using max_size = typename std::integral_constant<size_t, sizeof(Head)>::type;
    
    template <typename Head, typename... Tail>
    using max_size = ?;
    
    Run Code Online (Sandbox Code Playgroud)
  • constexpr 功能:

    template <typename Head>
    constexpr size_t max_size() { return sizeof(Head); }
    
    template <typename Head, typename... Tail>
    constexpr size_t max_size() { ? }
    
    Run Code Online (Sandbox Code Playgroud)

我的问题是双重的:

  1. 计算的哪些特征决定了选择什么策略?

  2. 在每种情况下,上述最大尺寸示例的示例实现如何?

Mat*_* M. 5

我个人更喜欢功能而不是特性,我觉得它们更容易操作,更自然.但那肯定是主观的;)

#include <iostream>

template <typename Head>
constexpr size_t max_size() { return sizeof(Head); }

template <typename Head, typename Next, typename... Tail>
constexpr size_t max_size() {
    return max_size<Head>() > max_size<Next, Tail...>() ?
           max_size<Head>() : max_size<Next, Tail...>();
}

int main() {
  std::cout << "int: " << max_size<int>() << "\n";
  std::cout << "char, short, int: " << max_size<char, short, int>() << "\n";
  std::cout << "char, double, int: " << max_size<char, double, int>() << "\n";
}
Run Code Online (Sandbox Code Playgroud)

liveworkspace的行动:

int: 4
char, short, int: 4
char, double, int: 8
Run Code Online (Sandbox Code Playgroud)