当使用指定的初始值设定项时,我可以强制用户为成员提供值吗
Can I force a user to provide a value for a member when using designated initializers?
我创建了一个选项结构,旨在通过指定的初始值设定项使用:
struct FooOptions {
bool enableReticulation;
};
void Foo(FooOptions&& opts);
Foo(FooOptions{.enableReticulation = true});
不幸的是,因为bool
有一个默认的构造函数,所以这样做也是有效的:
Foo(FooOptions{});
但我不想这样;我希望Foo的用户明确决定是否启用网状。我可以通过这种方式通过运行时错误来实现这一点:
struct FooOptions {
bool enableReticulation = []() -> bool {
assert(false, "No value provided for enableReticulation");
}();
};
但我更愿意在编译时出错的情况下执行此操作。有办法做到这一点吗?如果需要,我可以将bool
更改为SomeWrapper<bool>
,只要我可以像初始化T
一样初始化SomeWrapper<T>
,但没有默认的初始化器。
您澄清了这是关于任意类的,而不是基元类型。对于任意类,使用任意构造函数:只需删除构造函数,但显式地delete
默认构造函数:
template<typename T> class SomeWrapper : public T {
SomeWrapper()=delete;
using T::T;
};
然后:
#include <vector>
foo F{ {1,2} }; // Works, initializes the vector with {1,2}
foo G{}; // Fails
对于基元类型,这可能无法正常工作。只需根据需要专门化SomeWrapper
即可。没有那么多原始类型需要处理。
处理类和非类类型的方法,感谢SFINAE:
template<typename T, typename Enabler = void> class TWrapper;
template<typename T>
class TWrapper<T, std::enable_if_t<std::is_class<T>::value>> : public T {
public:
TWrapper()=delete;
using T::T;
};
template<typename T>
class TWrapper<T, std::enable_if_t<!std::is_class<T>::value>>
{
public:
TWrapper()=delete;
T value;
TWrapper(T arg) : value(arg) {}
operator T() const { return value; }
};
演示
相关文章:
- 函数向量_指针有不同的原型,我可以构建一个吗
- 我可以使用 g++ 进行三种比较 (<=>) 吗?
- 我可以使用条件运算符初始化C风格的字符串文字吗
- 我可以信任表示整数的浮点或双精度来保持精度吗
- 我可以将一个用clang c++11编译的对象与另一个用c++17编译的对象链接起来吗
- 为什么我可以通过引用修改常量返回
- 我可以根据用户输入在运行时生成"循环"吗?
- 当使用指定的初始值设定项时,我可以强制用户为成员提供值吗
- 为什么我可以阻止基元的隐式转换,而不是用户定义类型的隐式转换
- C++ 如何将用户控件添加到窗体,以便我可以在面板之间转换
- 我可以使用什么方法或方式将用户输入的字符串转换为 C++ 中的整数
- 我可以在"setDefaultButton"中使用我自己的用户定义字符串吗
- 我可以在形式的应用程序中查询用户交互事件
- 无法将指针定义为用户定义的类,但我可以直接实例化
- 我可以在QListWidget的每个项中存储一些用户数据吗?
- 我可以设置预定义的用户输入值,而在visual studio调试
- Qt中是否有本机"file explorer",我可以使用它让用户选择特定文件的路径?
- 如何检测用户是否按下了Ctrl-Alt-Del或Alt-Tab,以便我可以最小化我的程序
- 我可以要求用户重新输入命令行参数吗?
- 我可以枚举已知组中的用户吗?