函数模板的模板参数自动推导探究

来源:互联网 发布:java默认访问修饰符 编辑:程序博客网 时间:2024/05/17 22:29

  • 内置类型推导
  • 自定义类型推导
  • 可调用类型推导
  • 省略号参数推导
  • 模板的模板类参数推导
  • 模板的模板函数参数推导


内置类型推导

template <typename T>void func(T value) {    cout << "type:" << typeid(T).name() << endl;}int main(int argc, char* argv[]){    func(1); // 推导为 int    func('a'); // 推导为 char    return 0;}

自定义类型推导

class myClass {};int main(int argc, char* argv[]){    myClass classObject;    func(classObject); // 推导为 myClass 类型    return 0;}

可调用类型推导

struct functor {    void operator () () {        cout << "functor" << endl;    }};int main(int argc, char* argv[]){    auto f = [](){        cout << "lambda in function object" << endl;    };    func(f); // 函数签名    func([](){ // lambda        cout << "lambda" << endl;    });    func(functor()); // 仿函数    return 0;}

省略号参数推导

template <typename Head, typename ... Args>void func(Head value, Args ... args) {    cout << "type:" << typeid(Head).name() << endl;    func(args...);}template <typename T>void func() {    cout << "type:" << typeid(T).name() << endl;}int main(int argc, char* argv[]){    func(1, 2.0, 'a', "a");    return 0;}

模板的模板类参数推导

在 C11 以前函数模板是无法推导模板参数的。

template <typename T, template <typename T1, typename T2> class TClass>void func(T value, TClass<T, T> tcobject) {    cout << "type:" << typeid(T).name() << endl; // output: i    cout << "type:" << typeid(TClass<T, T>).name() << endl; // output: 6TClassIiiE}int main(int argc, char* argv[]){    TClass<int, int> tcObject;    func(1, tcObject);    return 0;}

模板的模板函数参数推导

骗你啦,没有这个东西。顶多是推导出参数为一个模板:

template <typename T, typename F>void func(T value, F func) {    cout << "type:" << typeid(T).name() << endl; // output: i    cout << "type:" << typeid(F).name() << endl; // output: PFvvE    func();}template <typename T>void TFunc() {    cout << "Template Func" << endl;}int main(int argc, char* argv[]){    func(1, TFunc<int>);    return 0;}

CSDN 辣鸡 MD 编辑器,无序列表格式全丢