[英]Forcing instantiation of all of a template classes member functions
在模板 class 的初始开发期间,在我编写完整的测试用例之前,我发现我希望能够强制编译器为模板 class 的每个成员(包括非静态成员)生成代码特定的模板参数集,只是为了确保所有代码至少可以编译。
具体来说,我正在使用 GCC 9 (我真的不需要其他编译器的这种能力,因为它只是我想在开发过程中暂时实现的东西); 及其c++14
、 c++17
、 c++2a
和c++20
标准。
例如,我可能会编写以下代码:
template <typename D> struct test_me {
D value;
void mistake1 () { value[0] = 0; }
void mistake2 () { mistake1(value); }
// and a bajillion other member functions...
};
而且,鉴于我事先知道可能的模板参数的有限集(我们在这里说int
和float
),我只想确保它们至少在我工作时编译。
现在我可以做到这一点,这显然不够:
int main () {
test_me<int> i;
test_me<float> f;
}
由于没有生成mistake1
和mistake2
,因此尽管尝试对非数组类型进行索引访问,并且调用了不正确的function,但代码仍能正常编译。
所以我在开发过程中所做的只是编写调用所有成员函数的代码:
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 的情况下,有没有办法强制(可能暂时)编译器在给定模板参数的情况下为模板类的整个成员集生成代码?
语言不允许您尝试做的事情,至少对于您的测试 class 的隐式实例化。 当您使用某种类型隐式实例化test_me
时,不允许隐式实例化成员函数的定义,如temp.inst#11 :
An implementation shall not implicitly instantiate a function template, a variable template, a member template, a non-virtual member function , a member class or static data member of a templated class, or a substatement of a constexpr if statement ([stmt.if ]),除非需要这样的实例化。
所以如果你想隐式实例化所有mistake
的成员函数,你别无选择,只能以某种方式要求它们的实例化。 与您的testCalls
示例一样,您可以调用这些成员函数,或者您可以通过其他方式 ODR 使用它们,例如获取它们的地址。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.