微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

强制实例化所有模板类成员函数

如何解决强制实例化所有模板类成员函数

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

具体来说,我使用的是 GCC 9(我真的不需要其他编译器的这种能力,因为这只是我想在开发过程中暂时实现的东西);及其 c++14c++17c++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;
}

由于未生成 mistake1mistake2,因此尽管尝试对非数组类型进行索引访问以及错误函数调用代码仍能正常编译。

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

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,有没有办法强制(可能是暂时的)编译器为模板类的整个成员集生成代码,给定模板参数?

解决方法

只需显式实例化类:

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

Demo

,

语言不允许您尝试执行的操作,至少在测试类的隐式实例化时是这样。当您使用某种类型隐式实例化 test_me 时,不允许隐式实例化成员函数的定义,如 temp.inst#11

一个实现不应隐式实例化函数模板、变量模板、成员模板、非虚拟成员函数、成员类或静态数据成员模板化类或 constexpr if 语句 ([stmt.if]) 的子语句,除非需要此类实例化。

所以如果你想隐式实例化所有的 mistake 成员函数,你别无选择,只能以某种方式要求它们的实例化。就像在 testCalls 的示例中一样,您可以调用这些成员函数,也可以通过其他方式 ODR 使用它们,例如获取它们的地址。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。