Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is there a template in C++11 to deduce the optimal type to use when passing a value to a function?

Tags:

c++

c++11

I'd like to write a template function

template <typename T>
void f( T v );

such that v will be passed by value if it's small enough, otherwise by reference-to-const. For this, I used a little helper

template <typename T, bool>
struct parameter_helper;

template <typename T>
struct parameter_helper<T, true> {
    typedef T type;
};

template <typename T>
struct parameter_helper<T, false> {
    typedef const T& type;
};

template <typename T>
struct parameter {
    typedef typename parameter_helper<T, sizeof(T) <= sizeof(void*)>::type type;
};

in the past such that I can have

template <typename T>
void f( typename parameter<T>::type v );

Now, in C++11: does this kind of helper template still make sense, or is there a better way to achieve the same effect? Is there maybe a ready-made template already? I checked <type_traits> but couldn't spot anything which seemed relevant.

like image 932
Frerich Raabe Avatar asked Jul 17 '13 18:07

Frerich Raabe


1 Answers

With C++11 you can define an alias template and save yourself some typing.

template<typename T> 
using parameter_t = typename parameter<T>::type;

and then use it as

template <typename T>
void f( parameter_t<T> v ); 

AFAIK, there's nothing built into the standard library for this. Also, you will lose template argument deduction implementing such a trait, which, in my opinion, reduces its utility greatly.

like image 61
Praetorian Avatar answered Nov 07 '22 12:11

Praetorian