在C++ 11中是否有一个模板可以推导出在将值传递给函数时使用的最佳类型?

Fre*_*abe 16 c++ c++11

我想写一个模板函数

template <typename T>
void f( T v );
Run Code Online (Sandbox Code Playgroud)

v如果它足够小,将通过值传递,否则通过引用到const传递.为此,我使用了一个小帮手

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;
};
Run Code Online (Sandbox Code Playgroud)

在过去,我可以拥有

template <typename T>
void f( typename parameter<T>::type v );
Run Code Online (Sandbox Code Playgroud)

现在,在C++ 11中:这种辅助模板是否仍然有意义,还是有更好的方法来实现相同的效果?可能已经有现成的模板吗?我检查过<type_traits>但无法发现任何看似相关的东西.

Pra*_*ian 13

使用C++ 11,您可以定义别名模板并节省一些输入.

template<typename T> 
using parameter_t = typename parameter<T>::type;
Run Code Online (Sandbox Code Playgroud)

然后用它作为

template <typename T>
void f( parameter_t<T> v ); 
Run Code Online (Sandbox Code Playgroud)

AFAIK,标准库中没有内置任何内容.此外,您将失去实现此类特征的模板参数推断,在我看来,这会大大降低其效用.

  • +1表示建议方法引入的模板参数推导问题 (4认同)

Dav*_*eas 10

我不认为C++ 11在这方面有什么新东西,但......

我的建议是实际内化基本规则并直接使用它们.有些情况下,即使类型小于4个字节,您可能希望通过const引用传递(该函数将存储该引用以供稍后使用,尽管它不应更改它需要访问更新值的字段).

在相反的方向,如果函数要进行复制,你可能想要传递值,以便复制在界面中完成,复制可以省略或更改为移动操作,可能降低操作成本.