使用预C ++ 11工具可以实现result_of
type trait吗?
不需要可变参数,静态实现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
,比如一个可推理的上下文,一个额外的层,我将能够传递一个函数并将其拆分为其组件:{{1}只需使用函数类型。
不幸的是,班级专业化过程并没有构成可扣除的背景,即我不能做以下事情
return type, arg type, and function type
只提供template<>
struct result_of1<Ret F(Arg), Ret, Arg> {};
并推断其余部分,所以也许通过函数的参数过滤类型将是一个解决方案,但我无法理解它。
答案 0 :(得分:2)
没有
result_of
使用F
类型和一组参数传递给F
(Args...)
。然后它会确定从std::declval<F>()(std::declval<Args>()...)
获得的类型。
虽然你可以为每个arg计数创建它的固定arg-count版本,但你无法在C ++ 03中找到表达式的类型并在其他地方使用它。
尝试这样做可能涉及获取函数指针和函数引用和函数类型,并解压缩它们的类型确实可以帮助您实现目标。但是可调用的对象可能包含大量的重载。
bargain-basement版本只需要operator()
的地址,并且假设它没有重载且不是template
方法,可以推断出返回类型。
但是,在每种情况下,(Args...)
部分都是无用的,除了检查Args...
是否为有效参数的可能性。
result_of
能够在编译时完全调度并确定使用了哪些重载,并从该重载中提供返回类型。这不能在C ++ 03中完成。
答案 1 :(得分:1)
使用模板专业化:
template <typename Func>
struct result_of;
template <typename Ret>
struct result_of<Ret()>
{
typedef Ret ret;
};
template <typename Ret, typename P1>
struct result_of<Ret(P1)>
{
typedef Ret ret;
typedef P1 p1;
};