【问题标题】:Variadic template function with no template arguments没有模板参数的可变模板函数
【发布时间】:2016-01-23 18:11:08
【问题描述】:

我在 C++ 11 中有以下可变参数模板函数:

#include <functional>

template<class... T>
void Subscribe(std::function<void(T...)> handler)
{
    // contents omitted
}

我可以这样称呼它:

Subscribe<int>([](int value)
{
});

但我不能用空模板参数调用它(它不会在 Visual Studio 2015 中编译):

Subscribe<>([]()
{
});

我知道有一个类似的帖子: Calling variadic template function with no args failing,然而,在那篇文章中,没有人讨论在函数末尾使用 V 形符号 &lt;&gt; 作为可变参数模板类的正确用法。

我不想通过单独声明无参数版本来复制函数体内的代码。有没有办法用空模板参数调用方法?

【问题讨论】:

  • Subscribe(std::function&lt;void()&gt;( [](){} ));
  • 语法f&lt;&gt;(...) 已经在 C++11 之前用于表示“f 是一个模板;在重载解析期间不要考虑非模板重载”。正是出于这个原因,我怀疑它不能被重新用于表示“f 是一个零参数的可变参数模板”。在 C++11 之前,每个模板都至少有一个参数。
  • @Igor Tandetnik,Subscribe(std::function&lt;void()&gt;( [](){} )); 工作。将其添加为答案,我会将其标记为正确。非常感谢:-)
  • @Igor Tandetnik,根据您的想法,看起来 Subscribe((std::function)[](){}) 也可以诱使编译器解决此调用.您的技术也将回答类似的帖子;-)
  • 当我们继续将“c++”标签编辑到您的 C++11 问题中时,这应该暗示我们希望您从现在开始自己这样做。

标签: c++ c++11


【解决方案1】:

据我所知,没有办法显式提供零模板参数。 Subscribe&lt;&gt; 意味着别的东西,因为 pre-C++11 天:“Subscribe 这里是一个模板,在重载解析期间不要考虑非模板。”

可以使用

Subscribe(std::function<void()>( [](){
    // ...
} ));

这依赖于模板参数推导来推导空参数列表,并明确函数参数的类型以允许推导成功。

【讨论】:

    猜你喜欢
    • 2014-09-08
    • 2021-10-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-21
    • 1970-01-01
    相关资源
    最近更新 更多