我有一个模板函数启用(通过std :: enable_if)它的参数是一个原始指针,或者有一个std :: iterator类或者是一个std :: nullptr_t.在该函数中,原始指针(数据成员)设置为等于参数,如下所示:
template<class T> void myFunction(T it)
{
_ptr = &*it;
}
Run Code Online (Sandbox Code Playgroud)
&*适用于指针和迭代器......但它对于std :: nullptr_t失败了.是否有任何解决方案可以避免编写2个不同的功能?
谢谢.
我正在使用TR1 std::function来实现一个简单的回调机制.如果我不想nullptr回调,我会注册为回调处理程序.这编译并正常工作:
void Foo::MessageHandlingEnabled( bool enable ){
if( enable )
m_Bar.RegisterMessageHandler( std::bind(&Foo::BarMessageHandler, this, std::placeholders::_1) );
else
m_Bar.RegisterMessageHandler( nullptr );
}
Run Code Online (Sandbox Code Playgroud)
如果我使用三元运算符重写它...
void Foo::MessageHandlingEnabled( bool enable ){
m_Bar.RegisterMessageHandler( enable?
std::bind(&Foo::BarMessageHandler, this, std::placeholders::_1) :
nullptr );
}
Run Code Online (Sandbox Code Playgroud)
... VC++的编译器说:
错误C2446:':':没有从'nullptr'转换为'std :: tr1 :: _ Bind <_Result_type,_Ret,_BindN>'1> 1>
[1> _Result_type = void,1> _Ret = void,1>
_BindN = std :: tr1 :: _ Bind2,Foo*,std :: tr1 :: _ Ph <1 >> 1>] 1>没有构造函数可以采用源类型,或者构造函数重载解析是模糊的
这是编译器的限制,还是我做了一些愚蠢的事情?我知道在这种特殊情况下,使用三元运算符可能无法获得任何好处,但我只是好奇.
我有一个函数可以解决4个运动方程中的一个.参数是浮点数,有没有办法区分NULL参数和值为0的参数.我已经阅读了主题,似乎NULL和0是相同的.我想区分0和"虚无"形式的原因是因为0值赋值,而"虚无"表示我们不知道该值是什么.
float doSomething(float& foo, float& bar, float& goo, float& baz){
if(foo == (insert_null_value_here)){
return (foo_after_we_did_some_equation);
}
}
Run Code Online (Sandbox Code Playgroud)
正如我已经讨论过的,"null"值不能为NULL或0.如果参数都是指向浮点数的指针,那么如果我检查"nullptrs",这会工作吗?(不是我的主要问题)即使前一个问题是肯定的,我可以将什么值用于非指针/引用类型?(重新主要问题陈述)
看看我教授给我的一些代码,我不明白发生了什么.我是编程新手,完全迷失了.
vector <_Account*>*myvector = nullptr;
Run Code Online (Sandbox Code Playgroud)
所以我知道他创建了一个向量,我知道一个现有的类,Account所以这是一个vector指向Account对象的指针吗?我不知道第二个星号是做什么的?
我正在尝试编写一个托管C++(又名C++/CLI)库,该库链接到第三方本机C++库.第三方库的头文件包含使用该nullptr关键字的构造函数定义.我的托管项目无法编译,因为托管编译器定义nullptr为托管空引用,而第三方使用它来表示本机/未托管空指针.如何在不修改第三方库的头文件的情况下解决此问题?
有关nullptrvs的参考__nullptr,请参阅:https://msdn.microsoft.com/en-us/library/4ex65770.aspx
作为LeetCode的一部分,我编写了一个简单的递归函数来遍历二叉树并输出所有可能的路径.(没有必要考虑这个来回答我的问题.我只是提供示例代码以演示一个具体的例子.)
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
vector<string> binaryTreePaths(TreeNode* root) {
vector<string> paths;
if( root != nullptr ) {
string str;
binaryTreePathsHelper(root, paths, str);
}
return paths;
}
void binaryTreePathsHelper(TreeNode* node, vector<string>& paths, string str) {
str += std::to_string(node->val);
if( node->left == nullptr &&
node->right == nullptr ) {
paths.push_back(str); …Run Code Online (Sandbox Code Playgroud) 我在这里和其他资源上阅读了几个主题,并没有找到确切的答案.答案似乎永远不会.请确认.
停止.永远不会.如前所述,为什么可以将nullptr分配给std :: string?:
std::string str {nullptr}; // Undefined behavior
Run Code Online (Sandbox Code Playgroud)
所以如果这不会抛出(取决于实现),c_str()可以返回(char_t*)nullptr.
我相信,有没有其他方式获得nullptr的c_str().但必须要求StackOverflow社区确定.谢谢你的关注.
为了计算二叉树height(left)+height(right)+1的高度,将不存在的节点的高度定义为-1。因此,如果left或right为null,则该公式将有效而无需明确指定这些情况。
我在C ++中实现了这个想法,并确保如果,成员函数将不会访问成员变量this == nullptr。我的实现成功并且有效(至少在我的Linux机器上)。
我想找出这种方法可能带来的实际弊端,以及该标准是否规定了任何其他方面。所以,这就是我的问题。
#include <algorithm>
#include <iostream>
struct Node {
// default values of the child nodes are NULL
Node *left = nullptr;
Node *right = nullptr;
// store some value
int v;
int get_height() const __attribute__ ((optimize(0))) {
if (this == nullptr)
return -1;
return std::max(left->get_height(), right->get_height()) + 1;
}
};
int main() {
Node node1, node2, node3, node4;
node2.left = &node1;
node2.right = &node3;
node3.right = &node4;
std::cout << node2.get_height() << …Run Code Online (Sandbox Code Playgroud) 根据 C++ Primer 一书,我们可以将限定为 const 且值为 0 的变量分配给指针。这是书中的相关内容。
可以分配文字 0 或在编译时已知其值为 0 的常量:
然后提供以下代码片段。
int ival;
int zero = 0;
const int c_ival = 0;
int *pi = ival; // error
pi = zero; // error
pi = c_ival // ok: c_ival is a const with compile-time value of 0
Run Code Online (Sandbox Code Playgroud)
但是,当我运行类似的代码时,会引发错误。
int main()
{
const int c_ival = 0;
int *pi = c_ival;
}
Run Code Online (Sandbox Code Playgroud)
错误:从“int”到“int*”的无效转换 [-fpermissive]
我究竟做错了什么?
代码 1
#include <iostream>
int main()
{
std::cout << nullptr;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出
Error: Use of overloaded operator '<<' is ambiguous (with operand types 'std::ostream' (aka 'basic_ostream<char>') and 'nullptr_t')
Run Code Online (Sandbox Code Playgroud)
甚至有特定类型nullptr显示错误的原因。但
代码 2
#include <iostream>
int main()
{
std::cout << (void*)nullptr;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出
0
Run Code Online (Sandbox Code Playgroud)
工作正常。为什么void*即使它不是类型也能工作?
c++ ×10
nullptr ×10
pointers ×3
c++11 ×2
c++-cli ×1
c++17 ×1
kinematics ×1
null ×1
null-pointer ×1
parameters ×1
performance ×1
reference ×1
std-function ×1
string ×1
this ×1
vector ×1