gpt4 book ai didi

c++ - 类模板的所有实例化是否可以共享同一个模板独立成员函数?

转载 作者:太空狗 更新时间:2023-10-29 21:19:41 27 4
gpt4 key购买 nike

在下面的示例中,我假设将有两个不同的类模板函数实例化 get_count() ,这是多余的,因为它们不依赖于模板参数。这是真的(还是优化掉了?),当涉及到某些成员函数时,有没有办法让模板的所有实例化都使用一个通用函数(也许是一些模板参数通配符,比如 <*>?)?

template<class T>
class A {
private:
T obj;
int count;
public:
int get_count();
};

template<class T>
int A<T>::get_count() { // This function doesn't really need to
// depend on the template parameter.
return this->count;
}

int main() {
A<int> a; //<--First template instantiation
A<bool> b; //<--Second template instantiation
int i = a.get_count(); //<--Could theoretically use the same code
int j = b.get_count(); //<--
return 0;
}

还有,如果成员变量重新排列怎么办?

最佳答案

您错误地假设所有实例化都可以对 A<..>::get_count() 使用相同的代码.

查看类(class)成员:

    T obj;
int count;

因此,模板参数 T确定 count 的偏移量, 这是成员 get_count()返回。

无论如何,如果两个实例化碰巧产生相同的指令,没有什么能阻止编译器合并它们。
作为 QoI 问题,如果启用了优化,它应该是这样。

有一种方法可以让多个类对一个函数使用相同的代码,而不依赖于编译器优化:
从提供该功能的公共(public)基础派生。

struct A_base {
int get_count();
protected:
int count;
}
template<class T>
class A : A_base {
T obj;
};

int A_base::get_count() {
return this->count;
}

(尽管如此,最终假设规则占主导地位:编译器可能会复制代码以暴露优化可能性,否则将无法使用。)

关于c++ - 类模板的所有实例化是否可以共享同一个模板独立成员函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26529246/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com