【问题标题】:Rercusive template for processing type of each argument用于处理每个参数类型的递归模板
【发布时间】:2013-06-21 17:21:28
【问题描述】:

这是一个用于构建给定类型对象的通用函数。感谢可变参数模板如果找到匹配的构造函数 T 将被构造,否则编译器将在编译时抛出错误。

template <typename T, typename... Args>
void * build(Args... args){
    return new T(args...);
}

现在假设我不想传递 N 个参数,而是想从其他地方获取它们,例如从单例中获取它们,然后我必须以某种方式扩展 Arguments 并根据每个参数的类型调用一个方法:

class Singleton{

public:
    template <typename T>
    static T* getIstance(){ 
        return reinterpret_cast<T*>(istances_map[typeid(T).has_code()]);
    }
};

现在假设我打电话

MyClass * p = build<MyClass,Foo,Bar>();

我要做的是调用MyClass Constructor,并从单例中获取Foo和Bar的对应实例。这应该是扩展模板代码的示例:

MyClass * p = new MyClass( Singleton::getIstance<Foo>(),
                           Singleton::getIstance<Bar>()  
                          );

我觉得我需要一个递归模板和一个元组来解决这个问题。但这只是一种感觉。

【问题讨论】:

    标签: templates c++11 tuples variadic-templates


    【解决方案1】:
    template <typename T, typename... Args>
    T* build()
    {
        return new T{Singleton::getInstance<Args>()...};
    }
    

    【讨论】:

    • 你“拼错”getIstance ;)
    • stackoverflow 不允许我只编辑“1 个字符”的拼写错误。真的很难决定将一票选为最佳答案,最后我扔了一枚硬币:/。对不起另一个人。但也许也可以看到一个递归解决方案^^(如果有人想要最好的答案而没有随机性)
    【解决方案2】:

    你试过了吗:

    template <typename T, typename... Args>
    T* build() {
      return new T(Singleton::getIstance<Args>()...);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-27
      • 1970-01-01
      • 1970-01-01
      • 2017-02-22
      • 2017-03-18
      • 1970-01-01
      • 1970-01-01
      • 2017-07-13
      相关资源
      最近更新 更多