【问题标题】:Reducing virtually duplicate template instantiations减少几乎重复的模板实例化
【发布时间】:2015-08-13 19:22:26
【问题描述】:

我有一组(生成的)类,简化后大致如下所示:

class A {
public:
    static const int id = 0;
    typedef int value_type;
    void* data; // actually pointer to int
};
class B {
public:
    static const int id = 1;
    typedef float value_type;
    void* data; // actually pointer to float
};

总共有几十个,类型要少得多。我需要创建为所有这些计算一些派生值的类。现在显而易见的解决方案是使用这样的模板:

template<class T>
class Derived {
public:
    typename T::value_type value;
    void update(const void* data) {
        value = *static_cast<typename T::value_type*>(data);
        // do some calculations
    }
};

但这将为每个参数类 A、B 等实例化一个单独的类;其中大部分将是相同的。另一种解决方案是一个明显的模板类,如下所示:

template<typename T>
class Derived2 {
public:
    T value;
    void update(const void* data) {
        value = *static_cast<T*>(data);
    }
};

如果 A、B 等类的架构是从更改中生成的,那么这将使用此类手动更新代码。有没有办法使用 value_type typedefs 来生成 Derived2、Derived2 等的实例化,或者至少将手动参数化的实例化类型与类型 A、B 等相匹配?

这是一个嵌入式系统,因此目标是减少相同代码的数量,即使这会导致更复杂的 C++ 代码。用实际类型替换 void*s 会导致程序其他部分的代码爆炸,所以没有这样做。

【问题讨论】:

  • template&lt;class T&gt; using Derived = Derived2&lt;typename T::value_type&gt;;?
  • 我忘了说,我们使用的是专有的 C++2003 编译器。所以没有 C++11
  • 那么template&lt;class T&gt; struct Derived : Derived2&lt;typename T::value_type&gt; { };?
  • 谢谢!做到了。您可以将其发布为答案,以便我为您投票吗?
  • @T.C.,你应该这样回答。也许Derived 应该继承自Derived2,以防 OP 希望允许“顶级”类型之间进行其他更改。

标签: c++ templates


【解决方案1】:

如 cmets 中所述,这将满足您的需求:

template<class T> struct Derived : Derived2<typename T::value_type> { };

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-24
    • 1970-01-01
    • 2021-09-22
    • 1970-01-01
    • 1970-01-01
    • 2018-03-02
    • 2020-09-11
    • 2020-06-02
    相关资源
    最近更新 更多