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)我的问题是双重的:
计算的哪些特征决定了选择什么策略?
在每种情况下,上述最大尺寸示例的示例实现如何?
我个人更喜欢功能而不是特性,我觉得它们更容易操作,更自然.但那肯定是主观的;)
#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)