是否可以使用功能?

时间:2014-06-25 17:05:13

标签: c++ function c++11 using

例如

template<class T, class U>
void f();

template<class T> using g = f<T, int>;

或任何类似的功能想法?

2 个答案:

答案 0 :(得分:9)

没有。你不能这样做。您需要创建一个调用f的新函数,转发所有参数和模板参数。

template<class T, class U>
void f();

template<class T>
void g() {
    f<T, int>();
}

C ++ 14替代方案是函数指针类型的变量模板:

template<typename T>
void (*g)() = &f<T, int>;

虽然这种方法忽略了默认参数,但也可能有其他怪癖。 我强烈推荐更详细的包装方法。

答案 1 :(得分:2)

不,您可以这样做,因为模板化别名用于创建类型的别名,而不是具体数据。

您要做的是从函数的地址创建一个别名/类型,因为f<T, int>会衰减为指向函数的指针。

但是,您可以从函数f类型创建模板化别名。

template <typename T>
using g = typename std::add_pointer<decltype(f<T, int>)>::type;

int main() {
    // Type of 'func' is 'void (*)()' with template arguments '{T1=double, T2=int}'.
    g<double> func;

    func = f<double, int>; // Point to function with same signature and template args.
    func();                // Ok to call function.
}