将variadic模板功能转换为许多具体功能

Convert Variadic Template Function to many concrete functions

本文关键字:功能 许多具 转换 variadic      更新时间:2023-10-16

是否有编译器标志或技术来强制每个呼叫的一个非variadic函数生成具有唯一签名的变异功能模板?

在以下示例中,编译器使用签名int (int, float, double)int (float, double)int (double)

#include <iostream>
using namespace std;
template<class IntT, class argsf>
IntT SumArgs(const argsf& firstArg)
{
    return static_cast<IntT>(firstArg);
}
template<class IntT, class argsf, class ...argst>
IntT SumArgs(const argsf& firstArg, const argst&... restArgs)
{
    return static_cast<IntT>(firstArg + SumArgs<IntT>(restArgs...));
}
int main()
{
    cout<<"Sum result: " << SumArgs<int>(1, 2.f, 3.5);
    return 0;
}

前两个仍然是变异。但是,在某些情况下,可能需要避免variadic函数的开销,而是为上面列出的每个签名创建一个唯一的函数定义。有没有办法让编译器这样做?替代方法是编写明确使用0、1、2 ... n参数的功能版本,用于一些合理的n,并手工重复代码,但理想情况下,编译器可以为我们做这个重型。

c 17引入了折叠表达式(希望(您正在寻找的内容:

template <class R, class... Args>
constexpr R SumArgs(const Args&... args)
{
    return static_cast<R>((args + ...)); // fold expression
}

如果您不想使用variadic模板,则可以使用initializer_list

template <class R, class T>
constexpr R SumArgs(std::initializer_list<T> args)
{
    return std::accumulate(args.begin(), args.end(), R{});
}