C++:是否可以创建返回null的模板函数
C++: is it possible to create template function returning null?
我有一个可以返回不同类型的模板函数。
template <class typ>
typ GetRespVal_byField(const std::string & _fname){
for (pqxx::result::const_iterator row = m_result.begin();
row != m_result.end();
++row)
{
if (!row[_fname].is_null())
return row[_fname].as<typ>();
else
return NULL; //this is what i want
}
}
这是一个正确的实施吗?
只要typ
可以取NULL
值(或者如果typ
对象可以由NULL
值构造),是的,你可以。例如,如果type
是指针或int
。
您甚至可以返回foo_bar
。。。。如果foo_bar
是有效的typ
值,它将起作用。。。。
模板解析是在编译时完成的,因此,正如YSC所评论的,如果它进行编译,那么是的,在类型检查方面是允许的(现在,代码编译并不一定意味着它会在运行时工作,但对于您的特定问题,它已经足够好了)。。。。
是否可以创建返回null的模板函数?
一般来说,是的,当然。为什么模板函数不能做到这一点?
然而。。。
这是一个正确的实施吗?
这取决于您对"正确"的定义:)
例如,如果您试图用std::string
为typ
实例化函数,那么返回NULL
会调用未定义的行为(因为您将尝试从空指针构造std::string
)。不明确的行为通常被认为是非常不正确的。
考虑Boost。可选作为表示某个事物不存在的替代方案。它比NULL
更通用。
这是可能的,但可能并不总是一个好主意。例如,如果typ
是string
,那么您的代码将进行编译,因为NULL将被解释为char *
,从中隐式构造字符串。然而,当else
分支被命中时,代码将在运行时失败,因为尝试从NULL构造字符串是未定义的行为,几乎肯定会导致访问冲突。
因此,我建议至少对您的代码进行两项改进。
-
将类型特征与
static_assert
结合使用,以确保typ
是指针类型。将此添加到您的模板功能中:static_assert(is_pointer<typ>::value, "<typ> must be a pointer type");
这排除了不是指针但可以从指针构造的类型,并使错误消息对用户更加清晰。
-
返回
nullptr
而不是NULL
-主要是为了使意图更明确,但也为了避免转换为整型会是坏事的假设场景(与NULL
不同,nullptr
不是隐式转换为整型)。
更普遍地说,编译模板并没有多大作用。微软最近才放弃了一种可以粗略地称之为模板文本替代实现的东西:
选择实现这个[模板,在旧编译器中]的方法是对一个模板,然后将整个模板捕获为一个令牌字符串(这与编译器中处理宏的方式非常相似)稍后,当模板被实例化时,该令牌流将通过解析器重播,并且模板参数将被替换。
之所以放弃它,是因为它不足以正确实现模板。但是C++中的模板在很大程度上仍然是语义意义上的模板,这就是为什么使用代码编译模板的常用方法需要有可用的模板源。
这与严格意义上编译独立模板的C#(当然是编译IL)形成了鲜明对比。
实例化模板做得更多:
#include<iostream>
using namespace std;
// this works;
template<typename T> T f(T t)
{
return cout;
}
// this doesn't
// double d = f(1.0);
您可以编写一个类型trait类,为您使用的任何类型定义NULL。我想你对此会有问题——你会为std::string
指定什么NULL?您可以更改您的函数签名并返回std::pair<typ, bool>
,其中:
- 如果返回非NULL值,则
first
等于返回值,second
等于true
- 如果应返回NULL值,则第一个值等于默认的初始化类型,
second
为false
- 当使用通配符和null指针调用函数时,对输出的说明
- 为什么返回 NULL 不会破坏函数?
- 构造函数中的 QQuickItem 父项 null
- 在这个函数中是有缺陷的,因为取消引用 null 是无效的,所以我想更改代码
- 为什么TinyXML2的XMLDocument::FirstChild()函数在尝试解析这个有效的XML文件时返回NULL?
- C++不重载时间函数,所以我们不需要写 NULL 有什么原因吗?
- 指针永远不会在链表深层复制构造函数中达到 null
- 如何在 Visual C++ 中从返回类型为 map 的函数返回 null?
- 当传递NULL作为参数时,函数重载是如何工作的
- 从模板化函数返回Null对象
- Windows 函数"GetCursorInfo"返回成功,但光标的句柄为 NULL
- 在构造函数处将类对象强制转换为接口始终返回 NULL
- std::string 的 c_str() 函数如何返回以 null 结尾的字符串?
- C++ 由于类析构函数中的指针设置为 NULL 而导致的内存泄漏
- 具有 4 个指针的节点的递归插入函数返回 null
- 我可以为向量函数返回 NULL<double> 吗?
- JNI C FindClass函数返回null
- HBITMAP HBM = loadImage函数返回null
- 相当于 C++ 中的 C NULL 函数指针
- bind null函数指针