Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
339 views
in Technique[技术] by (71.8m points)

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

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.

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

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.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...