类模板的所有实例化是否可以共享相同的模板独立成员函数
Can all instantiations of a class template share the same template independent member function?
在下面的示例中,我假设类模板函数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()
。
看看班级成员:
T obj;
int count;
因此,tamplate参数T
决定了count
的偏移量,即返回的成员get_count()
。
无论如何,如果两个实例化碰巧产生相同的指令,没有什么会阻止编译器合并它们。
作为 QoI 问题,如果启用了优化,则应该这样做。
有一种方法可以使多个类对函数使用相同的代码,而无需依赖编译器优化:
派生自提供该功能的公共基础。
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;
}
(尽管如此,最终,假设规则仍然至高无上:编译器可能会复制代码以公开优化可能性,否则无法使用。
是的,有一种方法,它是一种使用的实现技术:
创建一个不依赖于模板参数的基类,并将与模板无关的代码放在那里。这将仅进行一次实例化。对于模板参数依赖代码,请在模板类本身中执行此操作:
class base {
int count;
public:
std::size_t get_count()...
};
template <class T>
class derived : public base {};
类似的技术用于减少实现中的代码膨胀。
相关文章:
- 查找存储在二叉搜索树的所有非叶子中的数据总和?(返回整数的独立递归函数
- 为什么C++哈希函数的返回类型是 std::size_t,而不是独立于平台的类型?
- 为什么"C++ Core Guidelines"推荐首选独立函数而不是类成员?
- Doxygen不会为独立函数生成文档
- 从独立函数中调用成员函数
- 定义可以执行对象方法和独立函数的函数时出现问题
- 在每个实例中,使成员函数中的静态变量独立
- 独立于元素内存管理的向量上的函数
- 调用 std::线程,指针指向独立函数
- 创建独立于构造函数的对象指针
- DBUS 代码在放置在守护进程内时崩溃,但在没有守护进程代码的独立独立 main() 函数中运行良好
- 为什么std::whatever::erase()是一个方法,std::remove()是独立函数
- 获得快速的k对独立散列函数的选项是什么
- 如何使用独立于索引的函数初始化向量
- 如何在C++上独立运行函数
- 调用需要具有结构的独立参数的 C++ 函数是否安全
- Visual Studio 2010-独立函数中存在链接器错误
- c++如何将成员函数一般地转换为独立函数(用作函数参数)
- 如何从独立函数中输入数据到数组中
- 推导独立函数的返回类型