当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《是否为未使用的模板类方法生成了对象代码?》经验,为你挑选了1个好方法。

我有一个C++模板类,它使用3个不同的类型参数进行实例化.有一种方法,类只需要对这些类型中的一种进行处理,而且不会使用其他两种类型进行调用.

是否会生成该方法的对象代码三次(对于实例化模板的所有类型),或者只生成一次对象代码(对于实际使用它的类型)?



1> Kristopher J..:

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

这在C++标准的[temp.inst]中有所介绍(在C++ 11中,这是§14.7.1/ 10.在C++ 14中,它是§14.7.1/ 11,在C++中是17它是§17.7.1/ 9.摘自下面的C++ 17)

实现不应隐式实例化函数模板,变量模板,成员模板,非虚拟成员函数,成员类,类模板的静态数据成员或constexprif语句的子语句(9.4.1) ,除非需要这样的实例化

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

template 
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;    // Xyzzy is instantiated
    Xyzzy baronly;   // Xyzzy is instantiated

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

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

    return 0;
}

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

但请注意,模板的"实例化"与生成的对象代码的数量并不直接相关.这取决于您的编译器/链接器实现.

推荐阅读
手机用户2402851335
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有