Search code examples
c++optimizationc++20micro-optimizationc++-concepts

C++ different using declarations for different concepts


Let's say, I have my List<T> class. I have a lot of functions where I have to pass a single object of my T type. For instance

void add(const T& item)
{
    ...
}

and it makes sense if T is some class or a struct. However, if T is a byte or integer, it's pointless or even wrong to pas it via reference, since memory pointer costs 8 bytes (4 on 32 bit system), i.e. I pass 1 byte size data type via 8 byte size pointer.

And so I decided to define argument data type using using directive. Kind of:

using argType = const T&; requires sizeof(T) > 8
using argType = T; requires sizeof(T) <= 8

But, obviously, this code doesn't work. Can you, please, propose me other solutions for that?


Solution

  • It sounds like what you need is conditional_t:

    #include <type_traits>
    
    template<class T>
    class List {
      using argType = std::conditional_t<(sizeof(T) > 8), const T&, T>;
      
      void add(argType item) { }
    };