c – 是否为未使用的模板类方法生成了对象代码?

前端之家收集整理的这篇文章主要介绍了c – 是否为未使用的模板类方法生成了对象代码?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个C模板类,用3种不同的类型参数实例化.有一种方法,类只需要具有这些类型中的一种,并且不会与另外两种类型一起调用.

将为该方法的对象代码生成三次(对于模板被实例化的所有类型),或仅生成一次的对象代码(对于实际使用该类型的类型)?

解决方法

虚拟成员函数在实例化类模板时被实例化,但非虚拟成员函数只有在被调用时被实例化.

这在C标准的第14.7节中有所描述.

还要注意,即使某些成员函数对于给定的模板参数不可实例化,也可以实例化一个类模板.例如:

template <class T>
class Xyzzy
{
public:
    void CallFoo() { t.foo(); }  // Invoke T::foo()
    void CallBar() { t.bar(); }  // Invoke T::bar()

private:
    T t;
};

class FooBar
{
public:
    void foo() { ... }
    void bar() { ... }
};

class BarOnly
{
public:
    void bar() { ... }
};

int main(int argc,const char** argv)
{
    Xyzzy<FooBar>  foobar;    // Xyzzy<FooBar> is instantiated
    Xyzzy<BarOnly> baronly;   // Xyzzy<BarOnly> is instantiated

    foobar.CallFoo();         // Calls FooBar::foo()
    foobar.CallBar();         // Calls FooBar::bar()

    baronly.CallBar();        // Calls BarOnly::bar()

    return 0;
}

这是有效的,即使Xyzzy :: CallFoo()不可实例化,因为没有像BarOnly :: foo()这样的东西.此功能经常用作模板元编程工具.

但是,请注意,模板的“实例化”与生成多少对象代码没有直接关系.这将取决于您的编译器/链接器实现.

猜你在找的C&C++相关文章