gpt4 book ai didi

c++ - 将类型转换/构造变成一个完美的可转发功能

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:43:53 26 4
gpt4 key购买 nike

中南合作:

#include <functional>

using std::function;
using std::forward;

template<typename ToType, typename... FromTypes>
ToType construct(FromTypes&&... fromTypes) {
return ToType(forward<FromTypes>(fromTypes)...);
}

class Maybe {
public:
Maybe() : m_value(42.0f) {}

template<typename Function>
auto apply(Function function) const -> decltype(function(std::declval<float>())) {
return function(value());
}

private:
float const& value() const {
return m_value;
}

float m_value;
};

int main() {
Maybe a;

a.apply(construct<int, float>);

return 0;
}

给出错误:

test.cpp: In instantiation of ‘decltype (function(declval<float>())) Maybe::apply(Function) const [with Function = int (*)(float&&); decltype (function(declval<float>())) = int]’:
test.cpp:31:32: required from here
test.cpp:17:28: error: invalid initialization of reference of type ‘float&&’ from expression of type ‘const float’
return function(value());
^

从报错信息来看,很明显是value()的问题返回 const& .

这里的关键点是,类型不是在第 17 行推导出来的,而在第 17 行,值被传递给它。 construct 时正在分配类型函数传递给 apply在第 31 行。

我为 construct 的模板指定了错误的类型. construct<int, float> .如果我使用 construct<int, float const&>它运行良好。

但是,这很麻烦并且需要了解 apply 的实现.而且它也永远不会绑定(bind)左值,因为 TT&&是不同的类型。 (因为缺少类型推导。)

有没有办法让我可以将一个函数传递给另一个函数,并在调用它的站点上进行类型推导,这样我就可以或多或少地对调用者透明地进行完美转发?或者是否有另一种方法可以实现这一目标,不会将复杂性泄露给调用者?

最佳答案

这个怎么样?

#include <functional>

using std::function;
using std::forward;

template<typename ToType>
class construct
{
public:
template<typename... FromTypes>
ToType operator()(FromTypes&&... fromTypes) {
return ToType(forward<FromTypes>(fromTypes)...);
}
};

class Maybe {
public:
Maybe() : m_value(42.0f) {}

template<typename Function>
auto apply(Function function) const -> decltype(function(std::declval<float>())) {
return function(value());
}

private:
float const& value() const {
return m_value;
}

float m_value;
};

int main() {
Maybe a;

a.apply(construct<int>());

return 0;
}

您只需指定要转换成的类型,在您给定的上下文中显然无法推断出该类型。

关于c++ - 将类型转换/构造变成一个完美的可转发功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24390907/

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