结果类型特征在C ++ 03中

时间:2015-02-09 14:29:09

标签: c++

使用预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> {}; 并推断其余部分,所以也许通过函数的参数过滤类型将是一个解决方案,但我无法理解它。

2 个答案:

答案 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;
};