- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试创建一个可延迟的调用对象。类似于(伪代码):
template <class FN>
struct delayable_call
{
return-type-of-FN call(); // <-- I'd like to use result_of here.
template<class ArgTypes...>
delayable_call(FN* pFn, ArgTypes... args);
FN* fn;
args-saving-struct;
};
我尝试使用 result_of::type 作为调用的返回类型,但在模板实例化期间出现错误,因为显然需要单独指定参数类型。
实例化:
int foo(bool, double); // function prototype.
delayable_call<int(bool, double)> delayable_foo(foo, false, 3.14); // instantiation
我读过的有关 result_of 的错误消息和文档似乎表明还必须指定参数类型。所以而不是 result_of<FN>::type
, 我需要指定 result_of<FN(bool, double)>::type
.这确实解决了我遇到的编译问题,但破坏了模板的通用性。
那么,当模板参数表示函数签名时,如何将 result_of 与模板参数一起使用?
最佳答案
template <class FN> struct delayable_call;
template<class R, class...Args> delayable_call<R(Args...)>{
typedef R(*)(Args...) pFN;
替换你的delayable_call
具有特化,您将同时获得R
和 Args...
.你需要Args...
无论如何存储参数。
但是,库强度的可延迟调用最终将使用类型删除。最简单的方法是一个简单的 std::function<R()>
将 lambda 插入其中:
int foo(double);
double x = 7;
std::function<int()> delayed_foo = [x]{ return foo(x); }
并按值捕获,除非您真的非常想通过引用捕获它。
你可以推断出 R
通过:
template<typename Fn, typename... Args>
std::function< typename std::result_of<Fn(Args...)>::type()>
make_delayed_call( Fn&& fn, Args&&... args ) {
return [=]{ return fn(std::move(args)...); }
}
这应该推断出你的 R
来自可调用对象和参数。这通过复制捕获所有内容——通过移动捕获需要更多样板文件或 C++14。
关于c++ - 有人可以解释如何在模板中使用 result_of 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20890233/
我没有什么好的解决办法。我有一段代码: #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
我是一名优秀的程序员,十分优秀!