【发布时间】:2021-01-20 13:05:10
【问题描述】:
我创建了以下类来创建任何类型的值,这些值在每次调用运算符时都是固定的或重新计算的:
template <typename T>
class DynamicValue {
private:
std::variant<T, std::function<T()>> getter;
public:
DynamicValue(const T& constant) : getter(constant){};
template <typename F, typename = std::enable_if_t<std::is_invocable_v<F>>>
DynamicValue(F&& function) : getter(function) {}
DynamicValue(const T* pointer) : DynamicValue([pointer]() { return *pointer; }) {}
DynamicValue(const DynamicValue& value) : getter(value.getter) {}
~DynamicValue() {}
DynamicValue& operator=(const DynamicValue& value) {
getter = value.getter;
return *this;
}
T operator()() {
return getter.index() == 0 ? std::get<T>(getter) : std::get<std::function<T()>>(getter)();
}
};
我还编写了以下虚拟结构来展示我的问题:
struct A {
int b;
};
问题是,理想情况下,我可以初始化任何DynamicValue<T>,就好像它是T 类型一样。所以,在这个例子中,因为我可以写A a = {1};,而不是写DynamicValue<A> a = A{1};,我可以写DynamicValue<A> a = {1};。但是,当我尝试这样做时,出现以下错误:
无法将“{1}”从“”转换为“动态值”
您可以尝试一个现场示例here。
有没有办法克服这个问题,还是我必须接受更长的语法?
【问题讨论】:
-
= {1}是聚合的初始化语法,不可用于非聚合类。相反,您应该使用统一的初始化语法{1}。 -
带括号的初始化列表没有类型,因此很难在模板上下文中使用。
标签: c++ templates constructor