首页 > 解决方案 > 强制实例化所有模板类成员函数

问题描述

在模板类的初始开发过程中,在我编写完整的测试用例之前,我发现我希望能够强制编译器为模板类的每个成员(包括非静态成员)生成代码特定的模板参数集,只是为了确保所有代码至少可以编译。

具体来说,我使用的是 GCC 9(对于其他编译器,我真的不需要这种能力,因为这只是我想在开发过程中暂时实现的东西);及其c++14, c++17,c++2ac++20标准。

例如,我可能会编写以下代码:

template <typename D> struct test_me {
  D value;
  void mistake1 () { value[0] = 0; }
  void mistake2 () { mistake1(value); }
  // and a bajillion other member functions...
};

而且,鉴于我事先知道可能的模板参数的有限集(比如说intfloat这里),我只想确保它们至少在我工作时编译。

现在我可以做到这一点,这显然不够:

int main () {
  test_me<int> i;
  test_me<float> f;
}

由于mistake1并且mistake2没有生成,因此尽管尝试对非数组类型进行索引访问以及不正确的函数调用,但代码编译得很好。

所以我在开发过程中所做的只是编写调用所有成员函数的代码:

template <typename D> static void testCalls () {
    test_me<D> t;
    t.mistake1();
    t.mistake2();
    // and so on... so many mistakes...
}

int main () {
   testCalls<int>();
   testCalls<float>();
}

但这会变得很痛苦,特别是当成员函数开始有复杂的副作用或前提条件,或者需要非平凡的参数,或者有非公共成员和尚未开发的朋友时。因此,我想要一种无需显式调用所有内容即可测试编译的方法(理想情况下,我希望能够在添加新成员时完全不修改任何“测试”代码来测试编译)。

所以我的问题是:对于至少 GCC 9,有没有办法强制(可能暂时)编译器为模板类的整个成员集生成代码,给定模板参数?

标签: c++templatestestinggccgcc9

解决方案


只需显式实例化该类:

template struct test_me<int>;
template struct test_me<float>;

演示


推荐阅读