Visual C++ 12(VS2013 预览版)带有函数参数解决方法的可变参数模板

2023-12-24

我刚刚提交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 中使用(编译时)函数指针参数的任何其他方法?


不知道为什么,但使用 typedef 进行简化似乎有效:

template <typename... P>
struct S
{
    typedef void (*MyFunc)(P...);

    template <MyFunc myFunc>
    static void foo() {}
};

void foo2(int, float) {}

int main()
{
    S<int, float>::foo<&foo2>();
}

至少在 Visual Studio 2013 Ultimate Preview 上是这样。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Visual C++ 12(VS2013 预览版)带有函数参数解决方法的可变参数模板 的相关文章

随机推荐