- 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/
我的应用程序从一个有 5 个选项卡的选项卡栏 Controller 开始。一开始,第一个出现了它的名字,但其他四个没有名字,直到我点击它们。然后根据用户使用的语言显示名称。如何在选项卡栏出现之前设置选
我有嵌套数组 json 对象(第 1 层、第 2 层和第 3 层)。我的问题是数据表没有出现。任何相关的 CDN 均已导入。该表仅显示部分。我引用了很多网站,但都没有解决我的问题。 之前我使用标准表来
我正在尝试设置要显示的 Parse PFLoginViewController。这是我的一个 View Controller 的类。 import UIKit import Parse import
我遇到了这个问题,我绘制的对象没有出现在 GUI 中。我知道它正在被处理,因为数据被推送到日志文件。但是,图形没有出现。 这是我的一些代码: public static void main(Strin
我有一个树状图,其中包含出现这样的词...... TreeMap occurrence = new TreeMap (); 字符串 = 单词 整数 = 出现次数。 我如何获得最大出现次数 - 整数,
因此,我提示用户输入变量。如果变量小于 0 且大于 10。如果用户输入 10,我想要求用户再次输入数字。我问时间的时候输入4,它说你输入错误。但在第二次尝试时效果很好。例如:如果我输入 25,它会打印
我已经用 css overflow 属性做了一个例子。在这个例子中我遇到了一个溢出滚动的问题。滚动条出现了,但没有工作意味着每当将光标移动到滚动条时,在这个滚动条不活动的时间。我对此一无所知,所以请帮
我现在正在做一个元素。当您单击一个元素时,会出现以下信息,我想知道如何在您单击下一个元素而不重新单击同一元素时使其消失....例如,我的元素中有披萨,我想单击肉披萨看到浇头然后点击奶酪披萨看到浇头和肉
我有一个路由器模块,它将主题与正则表达式进行比较,并将出现的事件与一致的键掩码链接起来。 (它是一个简单的 url 路由过滤,如 symfony http://symfony.com/doc/curr
这个问题在这里已经有了答案: 9年前关闭。 Possible Duplicate: mysql_fetch_array() expects parameter 1 to be resource, bo
我在底部有一个带有工具栏的 View ,我正在使用 NavigationLink 导航到该 View 。但是当 View 出现时,工具栏显示得有点太低了。大约半秒钟后,它突然跳到位。它只会在应用程序启
我试图在我的应用程序上为背景音乐添加一个 AVAudioPlayer,我正在主屏幕上启动播放器,尝试在应用程序打开时开始播放但出现意外行为... 它播放并立即不断创建新玩家并播放这些玩家,因此同时播放
这是获取一个数字,获取其阶乘并将其加倍,但是由于基本情况,如果您输入 0,它会给出 2 作为答案,因此为了绕过它,我使用了 if 语句,但收到错误输入“if”时解析错误。如果你们能提供帮助,我真的很感
暂停期间抛出异常 android.os.DeadObjectException 在 android.os.BinderProxy.transactNative( native 方法) 在 androi
我已经为猜词游戏编写了一些代码。它从用户输入中读取字符并在单词中搜索该字符;根据字符是否在单词中,程序返回并控制一些变量。 代码如下: import java.util.Random; import
我是自动化领域的新手。这是我的简单 TestNG 登录代码,当我以 TestNG 身份运行该代码时,它会出现 java.lang.NullPointerException,双击它会突出显示我导航到 U
我是c#程序员,我习惯了c#的封装语法和其他东西。但是现在,由于某些原因,我应该用java写一些东西,我现在正在练习java一天!我要创建一个为我自己创建一个虚拟项目,以便让自己更熟悉 Java 的
我正在使用 Intellij,我的源类是 main.com.coding,我的资源文件是 main.com.testing。我将 spring.xml 文件放入资源文件中。 我的测试类位于 test.
我想要我的tests folder separate到我的应用程序代码。我的项目结构是这样的 myproject/ myproject/ myproject.py moduleon
这个问题已经有答案了: What is a NullPointerException, and how do I fix it? (12 个回答) 已关闭 6 年前。 因此,我尝试比较 2 个值,一个
我是一名优秀的程序员,十分优秀!