简体   繁体   中英

Can all instantiations of a class template share the same template independent member function?

In the example below, I assume there will be two different instantiations of the class template function get_count() , which is redundant since they are not depending on the template parameter. Is this true (or optimized away?), and is there a way to make all instantiations of a template use a common function (maybe some template argument wildcard, like <*> ?) when it comes to some member functions?

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

Also, what if the member variables are re-arranged?

You are quite mistaken in your assumption that all instantiations can use the same code for A<..>::get_count() .

Look at the class members:

    T obj;
    int count;

Thus, the tamplate-argument T determines the offset of count , which is the member get_count() returns.

Anyway, should two instantiations happen to produce the same instructions, nothing prohibits the compiler from mergeing them.
As a QoI-issue, it should if optimizations are enabled.

There is a way to make multiple classes use the same code for a function without relying on compiler-optimization:
Derive from a common base providing that function.

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

(Still, in the end the as-if-rule reigns supreme: The compiler may duplicate code to expose optimization possibilities otherwise not useable.)

Yes, there is a way and it is an implementation technique used:

Make a base class that does not depend on the template parameter and put the template-independent code there. This will make the instantiation only once. For the template parameters dependent code, do it in the template class itself:

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

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

Similar techniques are used to reduce code bloat in implementations.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM