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

标签 c++ c++11 templates

我有一个模板生成器/工厂类,它生成 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 我可以移动 T1T2到同一级别 - 通过使它们成为类模板参数或函数模板参数,但前者需要为每个新类型创建不同的制造商 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/

相关文章:

c++ - 这种基于线程 ID 的同步是否安全整洁?

c++ - 是否可以在 C++0x 中使用 auto 执行以下操作?

c++ - 无锁 fifo 缓冲区中的删除节点检测

c++11 - 是否可以使用大括号初始值设定项来删除结构数组?

c++ - 为什么在我使用模板时 VS 不自动完成?

c++ - 固定大小的特征类型作为参数

c++ - 错误 LNK2019 : unresolved external symbol _wWinMain@16 referenced in function ___tmainCRTStartup

c++ - 在 C++ 中对 Vector 进行并行化操作的最快方法?

c++ - 从 char 转换为 char16_t

html - Wordpress 内部样式的问题