gpt4 book ai didi

c++ - 请求从 lambda 到非标量类型的转换

转载 作者:行者123 更新时间:2023-12-03 11:15:00 26 4
gpt4 key购买 nike

我创建了这个类,所以我可以拥有任何类型的值,每次使用时都可以固定或重新计算:

template<typename T>
class Value {
private:
bool fixed;
union {
T value;
std::function<T()> get;
};
public:
Value(const T& value) : fixed(true), value(value) {}
Value(const std::function<T()>& get) : fixed(false), get(get) {}
Value(const T *pointer) : Value([pointer]() { return *pointer; }) {}
~Value() {}
operator T() { return fixed ? value : get(); }
};
以下所有表达式似乎都可以正常工作:
Value<double> a = 2.2;
double b = 1.;
double c = a;
Value<double> d = &b;
Value<int> e = Value<int>([]() { return 1.; });
但是当我尝试这样做时:
Value<double> f = []() { return 1.; };
触发编译错误:
error: conversion from 'main()::<lambda()>' to non-scalar type 'Value<double>' requested
你可以试试这个例子 here .
为什么为 T 分配工作而不是 std::function<T()>我怎样才能做到这一点?
注意:我知道 this answer但我并不清楚如何解决这个问题,而不必像我为 Value<double> e 那样显式调用构造函数.

最佳答案

Why does assigning work for T and not std::function<T()> and how can I make it so it does?


您的代码不使用赋值,而是 copy initialization

In addition, the implicit conversion in copy-initialization must produce T directly from the initializer, while, e.g. direct-initialization expects an implicit conversion from the initializer to an argument of T's constructor.


所以为了让它工作,你必须让你的ctor直接接受lambda(这是一个简化的例子):
template<typename T>
class Value {
std::function<T()> get;
public:

template<class Y>
Value(Y lambda ) : get( std::move( lambda ) ) {}
};
live code您可能想使用 std::enable_if 添加限制或概念,如果 C++20 被允许用于这个构造函数,并且在这种形式中,这个构造函数将尝试接受其他重载不会并可能产生神秘错误的所有内容。并根据此 enable_if template param is lambda (with particular signature)它可以很简单
template<class Y, typename = decltype(std::declval<Y&>()())>
Value(Y lambda ) : get( std::move( lambda ) ) {}
支持 C++14。这是 yet another live example您可以在其中看到此构造函数未用于 int 类型的初始化程序:
 Value<double> d2 = 123;

prog.cpp:9:5: note: candidate template ignored: substitution failure [with Y = int]: called object type 'int' is not a function or function pointerValue(Y lambda ) : get( std::move( lambda ) ) {}

关于c++ - 请求从 lambda 到非标量类型的转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65186151/

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