- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
以下代码无法编译:
template< typename Fn >
bool templateFunctionOne( Fn&& fn )
{
int v = 5;
return fn( v );
}
template < typename Fn >
bool templateFunctionTwo( Fn&& fn )
{
std::future< bool > tk( std::async( std::launch::async,
&templateFunctionOne< Fn >,
std::forward<Fn>(fn ) ) );
return tk.get();
}
bool printThis( int value )
{
cout << value << endl;
return true;
}
int main()
{
auto func = std::bind( &printThis, std::placeholders::_1 );
return templateFunctionTwo( func );
}
编译时出现如下错误:
functional::1665:61: error: no type named 'type' in 'class std::result_of< bool ((std::_Bind(std::_Placeholder<1>))(int)>))(std::_Bind))(int)>&)>'
我简化了上面的内容,但它仍然不会编译并出现相同的错误消息:
template< typename Fn >
bool templateFunctionOne( Fn&& fn )
{
return fn();
}
template < typename Fn >
bool templateFunctionTwo( Fn&& fn )
{
std::future< bool > tk( std::async( std::launch::async,
&templateFunctionOne< Fn >,
std::forward<Fn>(fn ) ) );
return tk.get();
}
bool printThis()
{
return true;
}
int main()
{
auto func = std::bind( &printThis );
return templateFunctionTwo( func );
}
因为现在函数 printThis
不需要传递任何参数,所以绑定(bind)调用不是必需的。当按如下方式更改 main 中的调用时,它编译得很好:
int main()
{
return templateFunctionTwo( &printThis );
}
谁能帮忙解释一下?在传递函数指针而不使用 std::ref
在需要其引用时包装参数时,我已经看到了同样的错误,但这似乎是别的东西(或不是),什么我在这里失踪了吗?
最佳答案
auto func = std::bind( &printThis );
return templateFunctionTwo( func );
func
是左值,所以当左值传入templateFunctionTwo
时, Fn
推导为 Fn&
(由于转发引用)。
线下
&templateFunctionOne< Fn >,
表示
&templateFunctionOne< Fn& >,
这意味着templateFunctionOne
通过引用接受它的论点,如果你想在调用时通过引用传递参数 async
你需要使用包装器 std::ref
或 std::cref
:
std::future< bool > tk = std::async(
templateFunctionOne< Fn >,
std::ref( std::forward<Fn>(fn) ) ); // <--- ref added
现在您的代码可以编译了。
另一种方法是使用 remove_reference_t<Fn>
或者 typename std::remove_reference<Fn>::type
从 Fn
中删除左值引用:
std::future< bool > tk = std::async(
templateFunctionOne< std::remove_reference_t<Fn> >, // <--- remove_reference_t added
std::forward<Fn>(fn) );
return tk.get();
然后 fn
对象按值传递。这个版本比第一个好,因为调用
templateFunctionTwo( std::bind( &printThis, std::placeholders::_1 ) )
在 ref
时失败使用,因为 ref
只需要取左值。
关于c++ - 类 std::result_of 中没有名为 'type' 的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53352886/
我没有什么好的解决办法。我有一段代码: #include #include #include #include #include #include #include #include
当 Callable 返回模板类型并收到以下错误 (clang++) 时,我正在尝试使用 result_of。我还提供了一个一切正常的简单案例。 错误: main.cpp:22:50: note: c
#include using namespace std; struct asd{ void f(); }; int f(); typedef typename result_of::typ
以下代码无法在 GCC 5.2 中编译: template result_of_t FuncCall(const FuncType &f, ArgTypes&... args) { retur
我正在尝试创建一个可延迟的调用对象。类似于(伪代码): template struct delayable_call { return-type-of-FN call(); //
这个问题在这里已经有了答案: Where and why do I have to put the "template" and "typename" keywords? (8 个答案) 关闭 7
我正在尝试在仿函数上使用 std::result_of。为什么我会得到这些结果? #include struct my_logical_not { template bool ope
这个问题我已经有一段时间了。假设我们有一个人为的功能: template std::result_of_t(???)> transform(F&& f) { static const int
通过 result_of 确定诸如 -int() 或 double()*double() 之类的结果的正确语法是什么? 失败 std::result_of::type std::result_of::
我想获得 std::make_tuple 为给定参数包返回的类型。到目前为止,我已经编写了以下代码: #include #include template struct unwrap_refwr
auto lambda = [](){ return 7; }; std::result_of::type val = lambda(); // 'val' : illegal use of typ
我听说 tr1::result_of 在 Boost 中被频繁使用...我想知道是否有 tr1::result_of 的任何好的(简单)用例我可以在家里使用。 最佳答案 result_of 的描述在
#include #include double f(int i) { return i+0.1; } struct F { public: dou
在 this answer我创建了一个类型特征: template using to_string_t = decltype(to_string(declval())); 这工作得很好,但我最初打算使
我想推断作为模板参数出现的函数的返回类型。考虑以下代码: #include struct Result {}; Result foo() { return Result{}; } template
我在玩游戏时注意到 std::result_of 的这种行为: struct Foo { int operator()(const int&) const { ... } char o
我使用的 HashMap 类型没有将其 KeyType 指定为公共(public)成员,只有 ValueType。检索 KeyType 的一种方法是使用 std::result_of与 HashMap
我认为这段代码是不言自明的,但基本上模板函数 ExecFunc 应该能够执行另一个函数并返回其结果。我知道我可以使用 decltype 而不是 result_of 获得类似的结果,但这个问题是为了理解
我向现有类添加了一个重载方法,这现在会导致我们的单元测试出现编译错误。 我已经用以下代码复制了这个问题: #include #include class Foo { public:
g++ -std=c++0x'ing std::result_of 后产生以下错误消息 error: ‘result_of’ in namespace ‘std’ does not name a ty
我是一名优秀的程序员,十分优秀!