gpt4 book ai didi

c++ - 可变参数模板 : invalid use of void expression

转载 作者:搜寻专家 更新时间:2023-10-31 01:11:25 24 4
gpt4 key购买 nike

我正在尝试为事件创建一个通用集合,以便它可以重复用于不同类型的事件集。在玩可变参数模板时,我遇到了 THIS answer ,这对我的例子很有帮助:

#include <boost/test/unit_test.hpp>

#include <string>
#include <unordered_map>

namespace
{
struct Event3 {
static const int event_type = 3;
int a;
};

struct Event5 {
static const int event_type = 5;
double d;
};

struct Event7 {
static const int event_type = 7;
std::string s;
};


template <class ...K>
void gun(K...) {}

template <class... Ts>
class EventCollection
{
template <typename T>
void update_map(std::unordered_map<int, size_t> & map, const T &)
{
BOOST_CHECK(map.find(T::event_type) == map.end());
map[T::event_type] = sizeof(T);
}


public:
std::unordered_map<int, size_t> curr_map;

EventCollection(Ts... ts)
{
gun(update_map(curr_map, ts)...); // will expand for each input type
}
};

} // namespace

BOOST_AUTO_TEST_CASE( test_01 )
{
Event3 x{13};
Event5 y{17.0};
Event7 z{"23"};

EventCollection<Event3, Event5, Event7> hoshi(x, y, z);
BOOST_CHECK_EQUAL(hoshi.curr_map.size(), 3);
}

但是,行

gun(update_map(curr_map, ts)...); // will expand for each input type

给我一个“错误:void 表达式的无效使用”。谁能告诉我,如何解决这个问题?

最佳答案

问题是您的 update_map 返回 void。因此你不能这样写:

gun(update_map(curr_map, ts)...); 

因为 update_map 的返回值应该作为参数传递给 gun

修复方法是将一些东西作为参数传递给 gun,因此您可以这样做:

gun( (update_map(curr_map, ts),0)...); 

现在表达式 (update_map(curr_map, ts),0) 结果是 0,它作为参数传递给 gun。那应该有效。您可以将其视为:

T argmument = (update_map(curr_map, ts),0);  //argument is 0, and T is int

--

此外,正如另一个答案所指出的那样,gun() 的参数求值顺序未指定(意味着调用函数 update_map 的顺序,未指定)这可能会导致不良结果。另一个解决方案已经给出了解决这个问题的方法。这是另一个(有点棘手但容易!):

//ensure that the size of the below array is at least one.
int do_in_order[] = {0, (update_map(curr_map, ts),0)...};

因为数组元素的初始化顺序是明确定义的(从左到右),现在所有对 update_map 的调用都按照明确定义的顺序进行。

关于c++ - 可变参数模板 : invalid use of void expression,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14924861/

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