如果传递的参数为nullptr,如何调用T类型的默认构造函数
How to invoke default constructor of Type T if passed argument is nullptr?
我有一个函数,它以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_or
和nullopt
,而不是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
}
相关文章:
- 构造函数正在调用一个使用当前类类型的函数
- 为什么类中的ostringstream类型的成员会导致";调用隐含删除复制构造函数";错误
- 从类型std::函数传递变量失败,尽管调用方期望的类型完全相同
- 来自 DLL 的函数调用 [表观调用的括号前面的表达式必须具有(指向-)函数类型]
- C++类型特征,以查看是否可以<uint32_t>对类型"K"的任何变量调用"static_cast(k)"
- 调用外部函数,无法指定类型 C++/MVS
- 如何在另一个类中调用类型类的向量?
- 调用类型的标记构造函数(如果可用),否则为默认值
- C++ 数组和指针调用类型
- 调用类型 'const RadioMap::comp' 的对象没有匹配函数
- 如何调用类型为预定义结构的函数
- 作为模板参数的可调用类型上的C++约束
- 模板类的构造函数在使用 new 关键字时调用类型构造函数
- 在运行时之前调用类型未知的模板化函数
- 在VS2010中获取可调用类型的返回类型
- 在什么情况下会调用类型的转换运算符?
- c++-builder:转换为标准调用类型
- 没有调用类型转换操作符
- C++编译时谓词,用于测试是否可以使用 T 类型的参数调用 F 类型的可调用对象
- 没有匹配函数来调用类型 'hash<char">' 的对象(Stroustrup Book Drill)