如果传递的参数为nullptr,如何调用T类型的默认构造函数

How to invoke default constructor of Type T if passed argument is nullptr?

本文关键字:调用 类型 构造函数 默认 参数 nullptr 如果 何调用      更新时间:2024-09-27

我有一个函数,它以std::string类型为参数,但我想向它传递一个空指针,并构造一个空字符串。现在,我正在使用if-else语句来完成这项任务,但我想为这个问题找到现代优雅的解决方案。

void print(int age, std::string name, int familyMembers, std::string state) {
std::cout << name << age << familyMembers << state << "n";
}
print(10, "sara", 5, nullptr);
print(10, nullptr, nullptr, nullptr); // Doesn't work
print(nullptr, nullptr, 12, nullptr); // Doesn't work

我需要一个运行时解决方案。以下工作,

std::string fromJS(const char * cstr) { return cstr ? { cstr };

但是,

print(10, fromJS(nullptr), 5, fromJS(nullptr));

随着争论的增加,可能会变得可怕。。

我正在寻找一个解决方案,在打印功能级别自动做到这一点

只需重写nullptr

void print(std::string name) {
std::cout << name << "n";
}
void print(std::nullptr_t) {
std::cout << "n";
}
print(nullptr);

更新:对于这样的"打印";参数不确定的函数,应该使用模板扩展:

template <typename T, typename... Ts>
void print(const T& arg, const Ts&... args) {
std::cout << arg;
print(args);
}
template <typename... Ts>
void print(std::nullptr_t, const Ts&... args) {
print(args);
}
template <typename T>
void print(const T& name) {
std::cout << name << "n";
}
void print(std::nullptr_t) {
std::cout << "n";
}
print(1, 1.0, "hello", nullptr, "hello"s, nullptr);

看看std::optional,它是value_ornullopt,而不是nullptr,所以您的代码变成了

void print(std::optional<std::string> name) {
std::cout << name.value_or("empty string passed") << "n";
}
int main()
{
print("non empty"); // prints non empty
print(nullopt);     // prints empty string passed
//NOTE: in last line I used nullopt instead of nullptr
}