我可以避免在一系列函数调用中使用模板消歧器吗?

Bee*_*ope 2 c++ templates c++11

我有一个模板构建器/工厂类,它使对象成为类型Foo,其中make()方法是模板方法,如下所示:

template<typename T1>
class FooMaker
{
  template<typename T2>
  Foo make(...) { ... }
};
Run Code Online (Sandbox Code Playgroud)

这里的想法T1是绑定到构建器,因为它对于所有make()调用都是相同的,而T2(对于每个调用,它总是一个函数名)通常是不同的make().

make()多次调用创建不同类型的对象,模板类和模板函数的组合意味着我必须template在每次调用之前使用消歧器:

template <typename MAKER_T>
void make_some_foos()
{
    auto maker = FooMaker<MAKER_T>(...);
    Foo foo1 = maker.template make<Type1>(...);
    Foo foo2 = maker.template make<Type2>(...);
    // etc...
}
Run Code Online (Sandbox Code Playgroud)

我想template在构造Foo上面的每一行上都需要关键字.一般来说,我make()对每个FooMaker对象都有很多调用,因此在创建工厂时会有少量额外的代码.

显然,我可以做到这一点使用它可以隐藏宏template细节,但有一个良好的非宏解决方案1


1我能够继续前进T1,并T2在同一水平-使它们既类模板参数,或两者功能模板参数,但前者需要一个不同的制造商为每一个新的类型T2,而后者的手段冗余指定相同的T1在每一个make电话.

asc*_*ler 6

这是一个std::get非成员函数,而不是成员的一个重要原因std::tuple.从该模式中获取想法,您可以创建一个非成员make_foo:

template <typename T2, typename T1, typename... Args>
Foo make_foo( FooMaker<T1>& maker, Args&& ... args ) {
    return maker.template make<T2>(std::forward<Args>(args)...);
}
Run Code Online (Sandbox Code Playgroud)

然后就像使用它一样:

auto maker = ...; // some code to construct the builder
Foo foo1 = make_foo<Type1>(maker, ...);
Foo foo2 = make_foo<Type2>(maker, ...);
// etc...
Run Code Online (Sandbox Code Playgroud)