gpt4 book ai didi

visual-studio - 参数包扩展失败

转载 作者:行者123 更新时间:2023-12-01 01:01:07 24 4
gpt4 key购买 nike

考虑以下简化的 C++ 代码:

template <typename ... TEventArgs>
struct Event
{
// ...
};

template <typename T>
struct Parameter
{
using Type = T;
// ...
};

template <typename ... Parameters>
struct Command
{
Event<typename Parameters::Type...> Invoked;
};

int main()
{
Command<Parameter<int>, Parameter<float>> c;
}

Visual Studio C++ 编译器(2013 年 11 月 CTP,Visual Studio 2013 更新 1)产生以下错误:
source.cpp(17): error C3546: '...' : 没有可扩展的参数包

明格 4.8.1。另一方面编译代码没有任何问题。显然,当表达式涉及访问可变参数类型时,Visual Studio 编译器有一个错误,阻止它扩展参数包。不过,其他扩展工作。例如, Event<std::vector<Parameters>...> Invoked; 编译成功,或者您甚至可以成功访问静态成员以在 Command 的构造函数中调用这样的可变参数函数: SomeVariadicFunc(Parameters::SomeStaticFunc()...);

所以,问题是:

1) 哪个编译器有问题:Visual Studio 还是 mingw?虽然我没有看到任何会阻止 typename Parameters::Type 参数包扩展工作的东西,但我不能 100% 确定它是有效的 C++。

2)有解决办法吗?基本上,我必须执行从 Parameters 的“序列”到 Parameters::Type 的“序列”的投影。那可能吗?我尝试使用递归结构构建该列表,但我只能想出类似 myStruct<type1, mystruct<type2, mystruct<type3, ...>>> 的东西,这不是我需要的。

感谢您的帮助。

最佳答案

Yakk 能够针对上述评论中的问题提出解决方法。与 Visual Studio 和 mingw 完美编译的最终版本如下:

template <typename ... TEventArgs>
struct Event
{
// ...
};

template <typename T>
struct Parameter
{
using Type = T;
// ...
};

template <typename ... Parameters>
struct Command
{
private:
// Workaround for the Visual Studio bug
template<typename T> struct ExpandArgs
{
typedef typename T::Type Type;
};

public:
Event<typename ExpandArgs<Parameters>::Type...> Invoked;
};

int main()
{
Command<Parameter<int>, Parameter<float>> c;
}

关于visual-studio - 参数包扩展失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23347287/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com