类模板的所有实例都可以共享相同的模板独立成员函数吗?

时间:2014-10-23 13:30:08

标签: c++ class templates methods instantiation

在下面的示例中,我假设将有两个不同的类模板函数get_count()的实例化,这是多余的,因为它们不依赖于模板参数。这是真的(或优化了吗?),是否有一种方法可以使模板的所有实例化使用一个公共函数(可能是一些模板参数通配符,如<*>?)来处理某些成员函数? / p>

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;
}

另外,如果重新安排成员变量怎么办?

2 个答案:

答案 0 :(得分:3)

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

查看班级成员:

    T obj;
    int count;

因此,tamplate-argument 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;
}

(尽管如此,as-if-rule仍然是最重要的:编译器可能会重复代码以暴露优化可能性,否则无法使用。)

答案 1 :(得分:0)

是的,有一种方法,它是一种使用的实现技术:

创建一个不依赖于模板参数的基类,并在其中放置与模板无关的代码。这将使实例化只进行一次。对于模板参数相关代码,请在模板类本身中执行:

class base {
   int count;
public:
    std::size_t get_count()...
};

template <class T>
class derived : public base {};

类似的技术用于减少实现中的代码膨胀。