在 C++ 中以 1 个表达式实例化对象的可自定义方式
Customizable way to instantiate objects in 1 expression in C++
在 Rust 中,有这个 crate 它利用 Rust 过程宏自动为定义的任意结构实现构建器模式。由于没有灵活的方法来使用一些默认值和一些提供的值来实例化 Rust 结构,这有助于减少样板文件。
在 C++ 中是否有任何类似的自动生成构建器的东西,因为在 C++ 中实例化对象也需要大量样板(大量重载构造函数以涵盖所有可能的字段组合或多步初始化),可能使用 C/C++ 宏?
按照评论的建议,我添加了一个例子来阐明我的想法。我想实例化下面的 class A,只需提供一些我想要的字段并将其他字段保留为默认值。如果是这样,我要么必须实现很多构造函数,要么执行多个步骤,实例化然后覆盖我想要的字段:
- 多个构造函数
#include <string>
#include <iostream>
class A
{
public:
int a = 2;
std::string b = "b";
int c = 5;
std::string d = "d";
A() {}
A(int a) { this->a = a; }
A(std::string b) { this->b = b; }
A(int a, std::string b)
{
this->a = a;
this->b = b;
}
// ... more constructors to cover all combinations
// this might not even work as some combinations might
// have similar types, which prevent overloading them
};
- 多个步骤
A a;
a.b = "hello";
a.c = 10;
多步实例化其实很好。但是,如果我想在 1 个表达式中自定义实例化,它就不起作用。
使用构建器模式,我通过如下链接方法在 1 个表达式中执行此操作:
BuilderOfA()
.a(7)
.c(8)
.build();
这个构建器的定义在C++中能否在编译时自动生成?如果没有,我是否可以在不使用多个表达式的情况下以可自定义的方式实例化对象(只需提供一些我想要的字段并将其他字段保留为默认值)?
在 C++ 20 中你可以这样做:
struct S {
std::string str = "Hello";
float y = 1.0f;
int x = 10;
};
auto a = S{ .str = "Hi", .x = 8 };
在 Rust 中,有这个 crate 它利用 Rust 过程宏自动为定义的任意结构实现构建器模式。由于没有灵活的方法来使用一些默认值和一些提供的值来实例化 Rust 结构,这有助于减少样板文件。
在 C++ 中是否有任何类似的自动生成构建器的东西,因为在 C++ 中实例化对象也需要大量样板(大量重载构造函数以涵盖所有可能的字段组合或多步初始化),可能使用 C/C++ 宏?
按照评论的建议,我添加了一个例子来阐明我的想法。我想实例化下面的 class A,只需提供一些我想要的字段并将其他字段保留为默认值。如果是这样,我要么必须实现很多构造函数,要么执行多个步骤,实例化然后覆盖我想要的字段:
- 多个构造函数
#include <string>
#include <iostream>
class A
{
public:
int a = 2;
std::string b = "b";
int c = 5;
std::string d = "d";
A() {}
A(int a) { this->a = a; }
A(std::string b) { this->b = b; }
A(int a, std::string b)
{
this->a = a;
this->b = b;
}
// ... more constructors to cover all combinations
// this might not even work as some combinations might
// have similar types, which prevent overloading them
};
- 多个步骤
A a;
a.b = "hello";
a.c = 10;
多步实例化其实很好。但是,如果我想在 1 个表达式中自定义实例化,它就不起作用。 使用构建器模式,我通过如下链接方法在 1 个表达式中执行此操作:
BuilderOfA()
.a(7)
.c(8)
.build();
这个构建器的定义在C++中能否在编译时自动生成?如果没有,我是否可以在不使用多个表达式的情况下以可自定义的方式实例化对象(只需提供一些我想要的字段并将其他字段保留为默认值)?
在 C++ 20 中你可以这样做:
struct S {
std::string str = "Hello";
float y = 1.0f;
int x = 10;
};
auto a = S{ .str = "Hi", .x = 8 };