我想写一个模板函数
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,标准库中没有内置任何内容.此外,您将失去实现此类特征的模板参数推断,在我看来,这会大大降低其效用.
Dav*_*eas 10
我不认为C++ 11在这方面有什么新东西,但......
我的建议是实际内化基本规则并直接使用它们.有些情况下,即使类型小于4个字节,您可能希望通过const引用传递(该函数将存储该引用以供稍后使用,尽管它不应更改它需要访问更新值的字段).
在相反的方向,如果函数要进行复制,你可能想要传递值,以便复制在界面中完成,复制可以省略或更改为移动操作,可能降低操作成本.
| 归档时间: |
|
| 查看次数: |
649 次 |
| 最近记录: |