我刚刚提交Microsoft Connect 上的此错误 https://connect.microsoft.com/VisualStudio/feedback/details/792024/variadic-templates-and-function-template-parameters#details关于无法编译以下玩具代码片段:
template <typename... P> struct S {
template <void(*F)(P...)> static void T() { }
};
void A(int, float) { }
int main() { S<int, float>::T<&A>(); }
错误是:
test.cpp(2): error C3520: 'P' : parameter pack must be expanded in this context
本质上,当用作模板参数时,我无法将函数签名内的可变参数类型解包。这段代码(我认为)是合法的;至少,GCC 4.7、Clang 3.0和ICC 13都支持它。
我见过这个问题 https://stackoverflow.com/questions/17332749/vs2013-fails-with-variadic-template-specialization但没有要求或给出任何解决方法,这正是我正在寻找的。
虽然不是超级关键(显然我已经在没有可变参数模板的情况下度过了很多年),但这种模式对于我想做的一些工作和我想做的一些关于 C++ 的文章特别重要11 个用于序列化、脚本绑定等的反射技术,我希望这对 Visual Studio 用户有用(因为它是迄今为止我所在行业中占主导地位的编译器工具集)。我希望 Microsoft 的工程师能够在 2013 年 RTM 之前解决这个问题,但我并没有屏住呼吸。
一个关于如何使用它的玩具(这次是从记忆中)示例是这样的(减去使它更容易使用的宏):
Reflect<MyType>("MyType")
.bind("GetMatrix", mat44, &MyType::GetMatrix>()
.bind("Display", void, &MyType::Display>();
当然,这一切都可以在没有可变参数模板的情况下完成。当然,它只需要大量代码并接受对绑定成员函数最大数量的限制。是的,由于成员函数指针在 Visual Studio 中工作的本质(可变大小)以及希望实现与快得难以置信的 C++ 委托 http://www.codeproject.com/Articles/11015/The-Impossibly-Fast-C-Delegates(在我的 C++ 社区中,这种级别的优化有时实际上很重要)这否定了使用std::function
或类似的设计。
VS 的这个 bug 有解决办法吗?或者使用可变参数模板在 VC++12 中使用(编译时)函数指针参数的任何其他方法?