编译器可以推断出模板参数吗?

Łuk*_*Lew 32 c++ templates

有时它有时不起作用:

template <class T> 
void f(T t) {}

template <class T>
class MyClass {
public:
  MyClass(T t) {}
};

void test () {
  f<int>(5);
  MyClass<int> mc(5);
  f(5);
  MyClass mc(5); // this doesn't work
}
Run Code Online (Sandbox Code Playgroud)

有没有办法破解上面的例子?即强制编译器从构造函数参数推断模板参数.

这将在未来修复,还是有充分理由不这样做?

编译器可以推断出模板参数的一般规则是什么?

jal*_*alf 56

当可以从模板参数推导出参数类型时,可以推断出函数模板的模板参数

所以可以在这里推断:

template <typename T>
void f(T t);

template <typename T>
void f(std::vector<T> v);
Run Code Online (Sandbox Code Playgroud)

但不是这里:

template <typename T>
T f() {
  return T();
}
Run Code Online (Sandbox Code Playgroud)

而不是在课堂模板中.

因此,您的问题的通常解决方案是创建一个包装函数,类似于标准库函数std::make_pair:

  template <class T>
    class MyClass {
    public:
        MyClass(T t) {}
        void print(){
            std::cout<<"try MyClass"<<std::endl;
        }
    };

    template <typename T>
    MyClass<T> MakeMyClass(T t) { return MyClass<T>(t); }
Run Code Online (Sandbox Code Playgroud)

然后调用auto a = MakeMyClass(5);实例化该类.

  • +1,彻底。小问题:我建议将“当参数类型依赖时”更改为“当参数类型依赖时”。 (2认同)
  • void f(typename T :: const_iterator t); <<在这里,T出现在一个不可约束的背景下.例如,即使用向量<int> :: const_iterator调用它,它也无法为T.推导出vector <int>.原因是:: const_iterator的含义取决于T.但是T再次取决于关于:: const_iterator的含义.这就是为什么boost :: implicit_cast的编码方式如下:template <typename T> T implicit_cast(typename identity <T> :: type t){return t; 在这里,我们有一个不可约束的背景. (2认同)
  • 这个答案现在已经过时了。可以推断类模板参数 [在 C++17 中](https://en.cppreference.com/w/cpp/language/class_template_argument_deduction)。 (2认同)

dir*_*tly 8

阅读Template Argument Deduction(以及ADL或Koenig查找).

  • 这是仅链接的答案,请考虑通过提供参考资料中的相关信息来改进此答案。 (2认同)