- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
有没有人看过 Andrei Alexandrescu 在 GoingNative2013 中关于爆炸元组的演讲?
这是我不太了解的一段代码:
template <class F, class... Ts>
auto explode(F&& f, const tuple<Ts...>& t)
-> typename result_of<F(Ts...)>::type
{
return Expander<sizeof...(Ts),
typename result_of<F(Ts...)>::type,
F,
const tuple<Ts...>&>::expand(f, t);
}
最佳答案
你想问的问题可能是这个问题的重复:Why does std::result_of take an (unrelated) function type as a type argument?
我们来剖析一下:
std::result_of<F(Ts...)>::type
namespace std
的某个地方, 我们有一个类模板
result_of<>
.它需要一个模板类型参数;即,它看起来基本上是这样的:
template<typename Foo>
struct result_of
{
typedef FOOBARBAZ type;
};
F(Ts...)
实例化这个模板.这是不寻常的语法!你大概知道
Ts
是一个参数包,因此
Ts...
括号内的将在编译时扩展为逗号分隔的类型列表,例如
int, double, bool
.所以我们有
F(int, double, bool)
.好的,这是一个函数类型。
int(char)
表示“函数采用
char
并返回
int
”,
F(int, double, bool)
也是如此意思是“函数取
int, double, bool
并返回
F
”。
F
已经是我的函数类型了!”
F
是
您的 函数类型。但是
std::result_of
预期的类型是,真的!,该函数类型包含在另一个函数类型中。详细说明:
typedef int (*F)(char);
typedef F G(char);
static_assert(std::is_same< std::result_of<G>::type, int >::value);
static_assert(std::is_same< std::result_of<F(char)>::type, int >::value);
static_assert(std::is_same< std::result_of<int (*(char))(char)>::type, int >::value);
F(char)
只是一种更美观的写作方式
int (*(char))(char)
.当然,您不能总是侥幸逃脱,因为有时
F
是不能从函数返回的函数类型:
typedef int F(char);
std::result_of<F(char)>; // fails to compile
std::result_of<F(Ts...)>::type
总是可以用不那么聪明但也不那么令人困惑的表达来代替
decltype( std::declval<F>() ( std::declval<Ts>()... ) )
decltype
的参数调用
F
类型的值的结果的
Ts...
。在这里,没有古怪的高级函数类型;一切都按照您自然期望的方式工作就我个人而言,我可能会在自己的代码中使用
decltype
方法,只是因为它更容易理解;但我想有些人会更喜欢
std::result_of
方法,因为它表面上看起来更简单,并且受到标准的祝福。给他自己的。:)
关于c++11 - Andrei Alexandrescu 关于爆炸元组的演讲中奇怪的 result_of<F(Ts...)>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18778596/
我没有什么好的解决办法。我有一段代码: #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
我是一名优秀的程序员,十分优秀!