我有一个模板生成器/工厂类,它生成 Foo
类型的对象, 其中make()
method 是一个模板方法,像这样:
template<typename T1>
class FooMaker
{
template<typename T2>
Foo make(...) { ... }
};
这里的想法是T1
绑定(bind)到构建器,因为它对所有 make()
都是相同的调用,同时 T2
(它始终是一个函数名称)对于每个 make()
通常是不同的打电话。
我调用 make()
多次创建不同类型的对象,以及模板类和模板函数的组合means I have to use the template
disambiguator before every call to make :
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...
}
我想要 template
构造 Foo
的每一行上的关键字多于。一般来说,我有很多电话给 make()
在每个 FooMaker
对象,因此在创建工厂时添加少量额外代码就可以了。
显然我可以使用隐藏 template
的宏来做到这一点详细点,但是有没有好的非宏方案1?
1 我可以移动 T1
和 T2
到同一级别 - 通过使它们成为类模板参数或函数模板参数,但前者需要为每个新类型创建不同的制造商 T2
后者意味着冗余指定相同的 T1
在每个make
打电话。
最佳答案
这是一大原因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)...);
}
然后像这样使用它:
auto maker = ...; // some code to construct the builder
Foo foo1 = make_foo<Type1>(maker, ...);
Foo foo2 = make_foo<Type2>(maker, ...);
// etc...
关于c++ - 我可以避免在一系列函数调用中使用模板消歧器吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48894878/