gpt4 book ai didi

c++ - 将代码移出类定义时未扩展参数包

转载 作者:行者123 更新时间:2023-11-30 02:19:55 25 4
gpt4 key购买 nike

我有这样的模板类:

template<typename... Args>
class Foo
{
public:
void Bar() {
(std::get<Args>(m_args).Bar(), ...);
}

private:
std::tuple<Args...> m_args;
};

下面是我的使用方式:

template<size_t I>
class Test
{
public:
void Bar() {
std::cout << I << std::endl;
}
};

int main() {
Foo<Test<0>, Test<1>> object;
object.Bar();
}

这个版本工作得很好,但我需要将方法定义移出类接口(interface)(以增加它的可读性)。问题是实现该技巧的语法是什么?

我已经试过了:

template<typename... Args>
void Foo<Args...>::Bar() {
(std::get<Args>(m_args).Bar(), ...);
}

但编译失败并显示错误消息:

error C3520: 'Args': parameter pack must be expanded in this context
note: while compiling class template member function 'void Foo<Test<0>,Test<1>>::Bar(void)'
note: see reference to function template instantiation 'void Foo<Test<0>,Test<1>>::Bar(void)' being compiled
note: see reference to class template instantiation 'Foo<Test<0>,Test<1>>' being compiled
error C2228: left of '.Bar' must have class/struct/union
error C2059: syntax error: '...'

我已经在 clang 7 上检查了这段代码,它可以正常工作,所以它看起来像 MSC 编译器错误(visual studio 15.7.1)。

Bug at developer community

最佳答案

这个东西看起来像 MSVC 错误,并在使用折叠表达式时重现。因此,解决方法是将代码从 C++ 17 降级到 C++ 14 并使用“经典”initializer_list hack:

template<typename... Args>
void Foo<Args...>::Bar() {
(void)std::initializer_list<int>{
(std::get<Args>(m_args).Bar(), 0)...
};
}

关于c++ - 将代码移出类定义时未扩展参数包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50282217/

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