从模板类中提取typedef / using定义

时间:2016-04-25 18:45:36

标签: c++ templates types casting

有没有办法从模板类中提取typedef?例如,这就是我想要做的事情:

template<typename T, typename... Args>
class Foo{
public:
   typedef T(*Functor)(Args...);
   Foo() = default;
};

template<typename T, typename... Args>
Foo<T, Args...> make_foo(T(*f)(Args...)){
    return Foo<T, Args...>;
}

int bar(int i){
    return i * 2;
}

using type = make_foo(bar)::Functor;

我不能这样做。但是,我可以这样做:

using type = Foo<int, int>::Functor;

这种打败了我的目的。有没有办法包装一个函数,以便我可以以类型形式提取它?

2 个答案:

答案 0 :(得分:5)

decltype会不够好?

using type = decltype(make_foo(bar))::Functor;

答案 1 :(得分:4)

使用decltype

template<typename T, typename... Args>
class Foo{
public:
   typedef T(*Functor)(Args...);
   Foo() = default;
};

template<typename T, typename... Args>
Foo<T, Args...> make_foo(T(*f)(Args...)){
    return Foo<T, Args...>{}; // Small compilation error fixed here.
}

int bar(int i){
    return i * 2;
}

using type = decltype(make_foo(bar))::Functor;

此运算符返回它所提供的表达式的类型。