- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
以下表达式使用 is_assignable
返回 true
使用 gcc 4.7 和 boost 1.49 时:
typedef boost::function<void()> F;
std::is_assignable<F, std::nullptr_t>::value
boost::function<void()> f;
f = nullptr;
In file included from c:\mingw\bin\../lib/gcc/i686-pc-mingw32/4.7.0/../../../../include/boost/function/detail/maybe_include.hpp:13:0,
from c:\mingw\bin\../lib/gcc/i686-pc-mingw32/4.7.0/../../../../include/boost/function/detail/function_iterate.hpp:14,
from c:\mingw\bin\../lib/gcc/i686-pc-mingw32/4.7.0/../../../../include/boost/preprocessor/iteration/detail/iter/forward1.hpp:47,
from c:\mingw\bin\../lib/gcc/i686-pc-mingw32/4.7.0/../../../../include/boost/function.hpp:64,
from ..\main.cpp:8:
c:\mingw\bin\../lib/gcc/i686-pc-mingw32/4.7.0/../../../../include/boost/function/function_template.hpp: In instantiation of 'static void boost::detail::function::void_function_obj_invoker0<FunctionObj, R>::invoke(boost::detail::function::function_buffer&) [with FunctionObj = std::nullptr_t; R = void]':
c:\mingw\bin\../lib/gcc/i686-pc-mingw32/4.7.0/../../../../include/boost/function/function_template.hpp:907:60: required from 'void boost::function0<R>::assign_to(Functor) [with Functor = std::nullptr_t; R = void]'
c:\mingw\bin\../lib/gcc/i686-pc-mingw32/4.7.0/../../../../include/boost/function/function_template.hpp:722:7: required from 'boost::function0<R>::function0(Functor, typename boost::enable_if_c<boost::type_traits::ice_not<boost::is_integral<Functor>::value>::value, int>::type) [with Functor = std::nullptr_t; R = void; typename boost::enable_if_c<boost::type_traits::ice_not<boost::is_integral<Functor>::value>::value, int>::type = int]'
c:\mingw\bin\../lib/gcc/i686-pc-mingw32/4.7.0/../../../../include/boost/function/function_template.hpp:1042:16: required from 'boost::function<R()>::function(Functor, typename boost::enable_if_c<boost::type_traits::ice_not<boost::is_integral<Functor>::value>::value, int>::type) [with Functor = std::nullptr_t; R = void; typename boost::enable_if_c<boost::type_traits::ice_not<boost::is_integral<Functor>::value>::value, int>::type = int]'
c:\mingw\bin\../lib/gcc/i686-pc-mingw32/4.7.0/../../../../include/boost/function/function_template.hpp:1083:5: required from 'typename boost::enable_if_c<boost::type_traits::ice_not<boost::is_integral<Functor>::value>::value, boost::function<R()>&>::type boost::function<R()>::operator=(Functor) [with Functor = std::nullptr_t; R = void; typename boost::enable_if_c<boost::type_traits::ice_not<boost::is_integral<Functor>::value>::value, boost::function<R()>&>::type = boost::function<void()>&]'
..\main.cpp:172:6: required from here
c:\mingw\bin\../lib/gcc/i686-pc-mingw32/4.7.0/../../../../include/boost/function/function_template.hpp:153:11: error: '* f' cannot be used as a function
false
:
typedef boost::function<void()> G;
std::is_assignable<G, decltype(NULL)>::value
boost::function<void()> g;
g = NULL;
is_assignable
的结果似乎没有正确反射(reflect)
boost::function
的功能.我在这里做错了吗? (我无法理解错误消息。)
template <typename F>
class callable_function
{
public:
callable_function(F func) : func_(func)
{
/* func_ is initially active */
}
void call()
{
if (/* func_ is active */) func_();
}
void deactivate()
{
/* set func_ to deactive */
}
private:
F func_;
};
/* func_ is active */
和
/* set func_ to deactive */
块,我想提供两种不同的实现,它们在编译时根据
F
的属性选择。 .如
nullptr
可以分配给
func_
和
func_
可以在 bool 上下文中使用,然后我想使用以下内容(这是为内置函数指针和
std::function
选择的内容):
template <typename F>
class callable_function
{
public:
callable_function(F func) : func_(func) {}
void call()
{
if (func_) func_();
}
void deactivate()
{
func_ = nullptr;
}
private:
F func_;
};
nullptr
不能分配给
func_
,然后我想在存储“事件”状态的类中存储一个额外的 bool 值。为仿函数和 lambda 函数选择此实现:
template <typename F>
class callable_function
{
public:
callable_function(F func) : func_(func), active_(true) {}
void call()
{
if (active_) func_();
}
void deactivate()
{
active_ = false;
}
private:
F func_;
bool active_;
};
nullptr
当前无法分配给
boost::function
,我希望选择第二个实现。但是,由于
is_assignable
正在返回
true
为
boost::function
和
nullptr
,改为选择第一个实现,这会导致
deactivate
中的编译错误功能。
最佳答案
[我对回答我自己的问题感到难过,但由于我已经了解了很多关于它的知识,我认为最好在这里合并这些信息。杰西在帮助我理解这一切方面起了很大作用,所以请在上面点赞他的评论。]
那么,为什么is_assignable
返回以下结果:
typedef boost::function<void()> F;
std::is_assignable<F, std::nullptr_t>::value // true
std::is_assignable<F, decltype(NULL)>::value // false
boost::function<void()> f;
f = nullptr; // fails to compile
f = NULL; // compiles correctly
is_constructible
、
is_assignable
、
is_convertible
等)只检查具有匹配给定类型的有效接口(interface)的函数模板。特别是,当这些类型被替换到函数体中时,它们不会检查该函数的实现是否有效。
boost::function
没有
nullptr
的特定构造函数,但它确实有一个“包罗万象”的模板赋值运算符(以及相应的构造函数):
template<typename Functor>
BOOST_FUNCTION_FUNCTION& operator=(Functor const & f);
nullptr
的最佳匹配,因为
std::nullptr_t
没有特定的过载并且这个不需要任何转换为另一种类型(除了转换为
const &
)。因为模板替换找到了这个赋值运算符,
std::is_assignable<boost::function<void()>, std::nullptr_t>
返回
true
.
Functor
预计是可调用类型;也就是说,
f();
预计是一个有效的陈述。
nullptr
不是可调用对象,因此,以下代码会导致问题中列出的编译器错误:
boost::function<void()> f;
f = nullptr; // fails to compile
std::is_assignable<boost::function<void()>, decltype(NULL)>
返回
false
?
boost::function
int
没有特定的赋值运算符参数,那么为什么不使用与
int
相同的“全能”模板赋值运算符和
std::nullptr_t
?
template<typename Functor>
typename enable_if_c<
(boost::type_traits::ice_not<
(is_integral<Functor>::value)>::value),
BOOST_FUNCTION_FUNCTION&>::type
operator=(Functor const & f)
enable_if_c
应该是不言而喻的。这里用来防止当参数类型为
int
时实例化这个赋值运算符。 (即,当
is_integral
返回
true
时)。因此,当赋值语句的右侧是
int
类型时,
boost::function
没有匹配的赋值运算符.这就是为什么
std::is_assignable<boost::function<void()>, decltype(NULL)>
返回
false
, 自
NULL
类型为
int
(至少对于 GCC)。
f = NULL;
正确编译。为了解释这一点,重要的是要注意值
0
可以隐式转换为任何指针类型。
boost::function
通过使用接受指向私有(private)结构的指针的赋值运算符来利用这一点。 (以下是来自
boost::function
的代码的大大简化版本,但足以证明我的观点):
namespace boost
{
template<typename R()>
function
{
private:
struct clear_type {}
//...
public:
BOOST_FUNCTION_FUNCTION& operator=(clear_type*);
//...
};
}
clear_type
是私有(private)结构,任何外部代码都无法创建它的实例。此赋值运算符唯一可以接受的值是从
0
隐式转换的空指针。 .这是使用表达式
f = NULL;
调用的赋值运算符.
is_assignable
并且赋值语句按照它们的方式工作,但它仍然不能帮助我解决我原来的问题:如何检测给定类型是否可以接受
nullptr
或
NULL
?
nullptr
,似乎没有好的答案。与
boost::function
,
nullptr
确实存在有效的接口(interface),但是函数体的实现对于这个类型是无效的,对于
f = nullptr;
这样的语句总是会导致编译错误.
NULL
可以分配给给定的类型,例如
boost::function
,在编译时?
std::is_assignable
要求我提供第二个参数的类型。我们已经知道
decltype(NULL)
不会工作,因为这评估为
int
.我可以用
boost::function<void()>::function::clear_type*
作为类型,但这非常冗长,并且需要我知道我正在使用的类型的内部细节。
template<typename> struct Void { typedef void type; };
template<typename T, typename Sfinae = void>
struct is_assignable_with_NULL: std::false_type {};
template<typename T>
struct is_assignable_with_NULL<T,
typename Void< decltype( std::declval<T>() = NULL ) >::type
>: std::true_type {};
std::is_assignable
一样使用这个新的类型特征,但我只需要在左侧提供对象的类型:
is_assignable_by_NULL<boost::function<void()>::value
boost::function
。 (和任何其他类型)在编译时。
关于c++ - 使用 std::is_assignable、boost::function 和 nullptr 时出现意外结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10220316/
我正在尝试为我的学校作业制作信息亭程序。当我编译它时,它不会发出任何错误信号。但是当我尝试初始化我的队列列表时,它说我不能使用 nullptr...我不明白我的代码有什么问题。 typedef str
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题吗? 更新问题,以便 editing this post 提供事实和引用来回答它. 关闭 4 年前。 Improve
这个问题在这里已经有了答案: Placement of the asterisk in pointer declarations (14 个答案) 关闭 4 年前。 在博客和论坛上,我注意到人们使用
为什么std::string str(nullptr)和 std::string str=nullptr是错的?有人可以详细解释原因吗? 最佳答案 这样的例子编译是因为存在一个 std::string
这个定义有效: const auto &b{nullptr}; 虽然失败: auto *b{nullptr}; 我尝试在 Visual C++、GCC 和 Clang 中编译它。他们都提示“无法推断类
刚刚看了一篇关于C++0x标准的文章:http://www.softwarequalityconnection.com/2011/06/the-biggest-changes-in-c11-and-w
我已将节点指针初始化为 nullptr 并将其作为引用传递给辅助函数。在辅助函数内,我将之前为 nullptr 的指针设置为等于 new Pointer。然而,函数结束后,它又被设置为nullptr。
有谁知道为什么分配type* = 0无效,而分配type* = nullptr无效呢?在这两种情况下typedef void type。谢谢 #include #include template
我正在尝试为类(class)项目创建链表。我的节点类有一个指向链接节点的指针和另一个指向专门书籍类的指针。 class Node{ private: Book *data; Node
我在destroyStudent()函数中删除指针aStudent,然后我将aStudent设置为空指针。但是,运行该函数后,aStudent 不再设置为nullptr,所以我必须再次将其设置为nul
我正在尝试制作一个基本的 HashMap。在将元素插入索引之前,我正在检查它是否存在于索引中。当我插入第一个元素时,它说该位置已经存在一个元素。我已经通过调试器,我的所有值都符合预期,map[hash
我正在尝试做类似的事情: if (foo) return SET_ERROR_AND_RETURN_NULL(ERROR_HERE); 使用... #define SET_ERROR_AND
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 6 年前。 Improve
我有一个看起来像这样的结构: struct Wolf { Wolf *dog; Wolf *puppy; }; 我写过: Wolf *alphawolf = new Wolf; 当我尝
我正在使用带有 Visual Studio 2012 的 C++(11)。 我使用定制的包装器类创建窗口。 CUIWindow* winA = new CUIWindow ( NULL, TEXT("
我为它编写了一个 PriorityQueue 类和一个迭代器类。但我不明白为什么这些行编译? PriorityQueue pq; auto z =pq.begin(); z=nullptr
我正在学习 enable_if 的用法我偶然发现了以下代码。 template ::value, T>::type* = nullpt
我有一个函数func(int a, char b, void *ptr)。第三个参数保留供内部使用,它应该是当前版本的 nullptr。有没有办法在函数原型(prototype)而不是定义中强制执行此
所以当我在学校编译它时 nullptr 错误没有出现,我想我可以通过在编译时添加一行来修复它,有没有另一种方法来摆脱它,另外两个错误我不明白为什么我要得到它们。有人可以至少解释一下 nullptr 错
这个问题在这里已经有了答案: Checking if this is null (8 个答案) 关闭 4 年前。 我想像这样替换代码: if ((obj != nullptr) && obj->is
我是一名优秀的程序员,十分优秀!