C++自动检测模板参数?

usm*_*man 17 c++ templates

我试图定义一个像任务农业一样的递归结构.在这里,我正在尝试两个操作数,递归地可以为任意数量的操作数工作,因为它可以嵌套自己.

template <typename T1, typename T2>
class Farm
{
  private:
    T1 *task1;
    T2 *task2;
  public:
    // save them so that I can use them when invoking call operator
    Farm(T1 *_t1, T2 *_t2): task1(_t1), task2(_t2) { }

    void operator()()
    {
      // invoke call operator, meaning a farm could be a task (arbitrary nesting)
      (*task1)();
      (*task2)();
    }
};
int main()
{
    ... create two pointer(A *a, B *b...)
    Farm(a,b); // error: missing template arguments before ‘(’ token

    Farm<A, B>(a,b); // in this works, it works
}
Run Code Online (Sandbox Code Playgroud)

问题在于自动检测模板参数,在这种情况下不起作用.我做错了什么,我怎么能通过gcc编译器实现这个模板参数隐式检测.

谢谢!

Mac*_*cke 16

类/构造函数不像函数那样自动检测类型.您需要编写一个包装函数来创建您的类.

这是如下完成的,称为对象生成器模式.(谢谢@Itjax!)

template <typename T1, typename T2>
Farm<T1, T2> makeFarm(T1* a, T2* b) {
      return Farm<T1,T2>(a,b);
}

// silly example
Farm<T1,T2> farm = makeFarm(a,b);

// better example
template<typename T>
void plow(T& farm) { farm.applyTractor(...); }

void blah() {
    plow(makeFarm(b,a)) 
}
Run Code Online (Sandbox Code Playgroud)

当你想使用一些参数创建一个模板化类的临时对象并避免指定它们的类型时,这种模式在使用lambda/bind/foreach和类似的部分时会出现很多,通常会将它发送到另一个模板函数(std::for_each)或多态对象中(std::function).

注意:生成器函数通常是内联的,并且通过copy-elision优化,根本不会在代码中调用复制构造函数.如果你不能复制你的对象,makeFarm()应该返回一个智能指针(std::unique_ptr在现代C++中是首选).

  • 究竟.这称为对象生成器习语:http://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Object_Generator (3认同)