c++ - C++03 中的 result_of 类型特征

标签 c++

result_of type trait可以使用 C++11 之前的工具实现吗?

不需要可变参数,1、2、3 ... args 的静态实现就足够了

尝试

我知道我能做到

template<typename Ret, typename Arg, Ret (F)(Arg)>
struct result_of1 // result of unary function
{
    typedef Ret type;  
};

int func(int&); 
result_of1<int, int&, func>::type a; 

从这里看来,如果我有办法推迟func,比如说一个可推导的上下文,一个额外的层,我将能够传递一个函数并将其拆分为其组件:返回类型、arg类型和函数类型只需使用函数类型即可。

不幸的是,类特化过程没有构成可推论的上下文,即我无法执行以下操作

template<>
struct result_of1<Ret F(Arg), Ret, Arg> {}; 

仅提供 F 并推导其余部分,因此也许通过函数的参数过滤类型将是一个解决方案,但我无法理解它。

最佳答案

没有。

result_of采用类型 F以及一组要传递给 F 的参数(Args...) 。然后它确定您从 std::declval<F>()(std::declval<Args>()...) 获得的类型。 .

虽然您可以为每个参数计数创建固定的参数计数版本,但您无法在 C++03 中找到表达式的类型并在其他地方使用它。

尝试这样做可能涉及获取函数指针、函数引用和函数类型并解压它们的类型,这确实可以帮助您实现这一目标。但可调用对象可以包含大量重载。

廉价的地下室版本只需使用 operator() 的地址即可。并且,假设它没有重载并且不是 template方法,可以推导出返回类型。

但是,在每种情况下,(Args...)除了可以检查 Args... 是否有效之外,部分没有用处。是有效参数。

result_of的要点能够在编译时进行完全调度并确定使用哪些重载,并为我们提供该重载的返回类型。这在 C++03 中无法完成。

关于c++ - C++03 中的 result_of 类型特征,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28412046/

相关文章:

c++ - 为什么 Visual C++ 2010 使用此汇编语法进行内存寻址?

c++ - 通过指针打印值

c++ - IDA PRO 将 C++ 代码转换为 C 代码 __OFSUB__ 宏

c++ - 尝试画吃 bean 人

c++ - 如何在C++源代码中将图像保存到字符串中

c++ - 我可以使用 std::shared_ptr 而不是 boost::shared_ptr 构建 boost 库吗

c++ - 在 C++ 中处理未终止的 char 数组有多容易?

c++ - 如何使用 googletest/googlemock 框架测试连续/相关的更改?

c++ - 获取指定char数组arduino的前n个元素

c++ - 如何使用 pack 作为模板参数实例化专门的模板类?