大形参自动使用const-ref
automatically use const-ref by big parameters
当我有以下伪类:
template <class T> class tmplClass
{
void doSomething(T input);
};
当sizeof(T)大于系统架构时,是否有办法将void doSomething(T input)
改为void doSomething(const T& input)
?
意味着,例如当你有tmplClass<char> c;
时,使用void doSomething(T input)
,当你有tmplClass<[another big class with lots of variables]>
时,使用void doSomething(const T& input)
- 我能从中得到任何优化吗?
- 有什么我必须做的,或者gcc可以自动完成
- 如果我必须做什么,什么?
当然:
template<typename T, bool=true>
struct eff_arg {
typedef T type;
};
template<typename T>
struct eff_arg<T, (sizeof(T)>sizeof(int))> {
typedef T const& type;
};
// C++11 addition
template<typename T>
using EffArg = typename eff_arg<T>::type;
使用:
template <class T> class tmplClass
{
// C++11
void doSomething(EffArg<T> input);
// C++03
void doSomething(typename eff_arg<T>::type input);
};
并将sizeof(int)
替换为您想要使用的任何类型,作为"您想要作为引用而不是通过值传递的点"。
请注意,参数的大小是做出此决定的普通方法:极小的类(甚至比指针还小!)可能具有深度复制语义,即在复制大结构时复制它。通常,截止值不应该是int
或指针的大小,而应该大于它们,因为间接操作有代价。
一个想法可能是只复制那些不管理资源并且足够小的对象。当您不需要数据的副本时,在通过T
而不是T const&
之前应该进行std::is_trivially_copyable<T>::value && (sizeof(T) <= 2*sizeof(void*))
检查。
结果如下:
template<typename T, bool=true>
struct eff_arg {
typedef T const& type;
};
template<typename T>
struct eff_arg<T,
std::is_trivially_copyable<T>::value
&& (sizeof(T)<=2*sizeof(void*))
> {
typedef T type;
};
template<typename T>
using EffArg = typename eff_arg<T>::type;
很简单:
#include <type_traits>
template <typename T> struct Foo
{
void do_something(typename std::conditional<(sizeof(T) > sizeof(void *)),
T const &, T>::type x)
{
// ... use "x"
}
// ...
};
您可能希望将结果类型分配给一些类型别名,以便于重用。
正如@Yakk所建议的,将std::is_trivially_copyable<T>::value
也添加到条件中可能是好的,以避免意外地复制昂贵的复制或可能抛出的内容。
相关文章:
- 包含void*结构的函数的Const正确性和形参
- const整型模板形参的条件
- 修改const形参引用
- 形参中const的位置差异
- Const模板形参在创建后不再保留Const性
- 为什么stable_sort函数中的ref形参需要const ?
- 如何在boost中使用boost::ref.传递参数时的形参库
- 大形参自动使用const-ref
- c++ const函数形参.有没有一种方法可以只声明函数的单个签名?
- 如何将const形参从一个成员函数传递到另一个成员函数
- 我想知道函数接受const形参和非const形参的区别
- const迭代器的模板形参,而不是迭代器
- 右值或左值(const)引用形参
- 在Bjarne的这个例子中,为什么可以将const限定对象传递给非const形参?
- const引用形参的默认值
- map带有const模板形参和const引用模板形参
- NULL直接传递给需要const引用形参的函数(vc++ 4.2)
- 避免非const引用形参
- 如何访问const引用形参的值
- 通过boost::thread传递const指针形参给函数