繁体   English   中英

使用变量模板调用可变参数函数

[英]Call a variadic function using a variable template

请考虑以下代码:

template<typename T, typename... Args>
void foo(const Args&... args)
{
    //...
}

template<typename... Args>
auto fooChar = foo<char, Args...>;

template<typename... Args>
auto fooInt = foo<int, Args...>;

为了能够使用这些变量模板,我需要明确地键入模板参数,如下所示:

fooChar<int, char, const char*>(5, 'a', "bar");

但是,在标准的可变参数函数调用中,模板参数是基于实际的函数参数类型而隐式推导出来的。 换句话说,我希望能够像这样使用变量模板,但额外的间接级别似乎限制了这个:

fooChar(5, 'a', "bar");

显然,我可以简单地定义简单的包装函数而不是变量模板,如下所示:

template<typename... Args>
void fooChar(const Args&... args)
{
    return foo<char>(args...);
}

template<typename... Args>
void fooInt(const Args&... args)
{
    return foo<int>(args...);
}

但总的来说,它看起来更笨重,更不方便。 那么,在使用变量模板时,有什么办法可以达到相同的效果吗? 如果没有,为什么编译器无法将参数“转发”到别名函数,从而推导出可变参数类型?

你可以在一个结构中包装foo()

template <class T>
struct fooWrapper {
    template <class... Args>
    void operator()(Args const&... args) const {
        foo<T>(args...);
    }
};

现在让你的变量模板成为这个包装器的实例:

fooWrapper<char> fooChar;
fooWrapper<int> fooInt;

有了额外的好处,你可以将fooChar传递给一个功能模板,因为它本身不是一个功能模板。

需要一个包装器:

#include <utility>

template<typename T, typename... Args>
void foo(const Args &&... args)
{
    //...
}

template<typename ...Args>
inline void fooChar(const Args && ...args)
{
    foo<char>(std::forward<Args>(args)...);
}

希望您的编译器能够优化函数调用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM