使用变量模板

时间:2017-06-07 12:29:16

标签: c++ templates c++14

请考虑以下代码:

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...);
}

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

2 个答案:

答案 0 :(得分:1)

您可以将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传递给一个功能模板,因为它本身不是一个功能模板。

答案 1 :(得分:-1)

需要一个包装器:

#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)...);
}

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