是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/