gpt4 book ai didi

c++ - 使用可变参数模板帮助程序进行多个 std::variant 访问

转载 作者:行者123 更新时间:2023-12-01 13:02:29 25 4
gpt4 key购买 nike

我正在尝试创建一个有助于处理 N std::variant 的函数类型。

注:我正在尝试验证所有路径的编译时间。所以std::optionalstd::holds_alternative对我来说不可行。

实现如下:

template<typename T>
using Possible = std::variant<std::monostate, T>;

template<typename... Types>
void ifAll(std::function<void(Types...)> all, Possible<Types>&&... possibles)
{
std::visit(
[&](auto&&... args) {
if constexpr ((... &&
std::is_same_v<std::decay_t<decltype(args)>, Types>))
{
return all(std::forward<Types>(args)...);
}
else
{
std::cout << "At least one type is monostate" << std::endl;
}
},
possibles...);
}

使用该函数的一个例子是:
int main()
{
Possible<int> a = 16;
Possible<bool> b = true;

ifAll([](const int& x, const bool& y)
-> void { std::cout << "All types set!" << std::endl; },
a,
b);
}

但是我收到一个编译器错误:
TestFile.cc: error: no matching function for call to 'ifAll'
ifAll([](const int& x, const bool& y)
^~~~~

TestFile.cc: note: candidate template ignored: could not match
'function<void (type-parameter-0-0...)>' against '(lambda at
TestFile.cc)'

void ifAll(std::function<void(Types...)> all, Possible<Types>&&... possibles)
^

为什么我提供的 lambda 与函数签名不匹配?

尝试修复 1

我试着搬进来 ab这仍然不起作用:
ifAll([](const int& x, const bool& y)
-> void { std::cout << "All types set!" << std::endl; },
std::move(a),
std::move(b));

最佳答案

以下电话将起作用:

int main() {
Possible<int> a = 16;
Possible<bool> b = true;

std::function<void(int, bool)> fun = [](int x, bool y) -> void {
std::cout << "All types set!" << std::endl;
};

ifAll(fun,
std::move(a),
std::move(b));
}

或将您的函数签名切换为:

template <typename... Types>
void ifAll(std::function<void(Types...)> const& all, Possible<Types>&... possibles)

然后你可以在没有 std::move 的情况下调用它:

int main() {
Possible<int> a = 16;
Possible<bool> b = true;

std::function<void(int, bool)> fun = [](int x, bool y) -> void {
std::cout << "All types set!" << std::endl;
};

ifAll(fun, a, b);
}

关于c++ - 使用可变参数模板帮助程序进行多个 std::variant 访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61053365/

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