【发布时间】: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 形符号 <> 作为可变参数模板类的正确用法。
我不想通过单独声明无参数版本来复制函数体内的代码。有没有办法用空模板参数调用方法?
【问题讨论】:
-
Subscribe(std::function<void()>( [](){} )); -
语法
f<>(...)已经在 C++11 之前用于表示“f是一个模板;在重载解析期间不要考虑非模板重载”。正是出于这个原因,我怀疑它不能被重新用于表示“f是一个零参数的可变参数模板”。在 C++11 之前,每个模板都至少有一个参数。 -
@Igor Tandetnik,
Subscribe(std::function<void()>( [](){} ));工作。将其添加为答案,我会将其标记为正确。非常感谢:-) -
@Igor Tandetnik,根据您的想法,看起来 Subscribe((std::function
)[](){}) 也可以诱使编译器解决此调用.您的技术也将回答类似的帖子;-) -
当我们继续将“c++”标签编辑到您的 C++11 问题中时,这应该暗示我们希望您从现在开始自己这样做。