调用函数,如果有,则忽略
Call function, if there is, ignore otherwise
我现在想做一个模板,将一些元素推入向量和其他类型,支持push_back
操作符。
我可以这样做
template<typename T>
T fill(size_t n) {
T v;
//(1)
for(size_t i = 0; i < n; ++i){
v.push_back(generate_some_how());
}
return v;
}
它的工作原理。但是现在我想提高使用v.reserve(n);
而不是(1)
支持它的类型的速度。但是我仍然希望能够为不能编译reserve
是否有一些简单的方法来实现这一点?
我知道我可以专门化硬编码类型,但这似乎不太好。
使用c++ 11的简单示例:
template<class T>
auto maybe_reserve(T& v, size_t n, int)
-> decltype(v.reserve(n), void())
{
v.reserve(n);
}
template<class T>
void maybe_reserve(T&, size_t, long){}
template<typename T>
T fill(std::size_t n) {
T v;
maybe_reserve(v, n, 0);
for(size_t i = 0; i < n; ++i){
v.push_back(generate_some_how());
}
return v;
}
生活的例子。
c++ 11中可能的方法:
template<typename T, typename = void>
struct reserve_helper
{ static void call(T& obj, std::size_t s) { } };
template<typename T>
struct reserve_helper<T, decltype(std::declval<T>().reserve(0), void(0))>
{ static void call(T& obj, std::size_t s) { obj.reserve(s); } };
template<typename T>
T fill(std::size_t n)
{
T v;
reserve_helper<T>::call(v, 10);
for(std::size_t i = 0; i < n; ++i){
v.push_back(generate_somehow());
}
return v;
}
下面是一个实时示例,显示了对reserve()
的调用被一个不定义任何reserve()
成员函数的UDT简单地跳过。
不太难....您需要编写一个trait来检测具有正确签名的保留成员函数的存在。有了这个工具,你有不同的方法,你可以写一个reserve_
模板函数,它使用该特征来调度对reserve()
或no-op的调用,并从// (1)
调用它,或者你可以在helper或fill
本身中使用SFINAE。我会尝试使用helper函数,因为fill中的大部分代码都是相同的。
检测void reserve(std::size_t)
成员函数是否存在于c++ 03:
template <typename T>
struct has_reserve {
typedef char yes;
typedef yes no[2];
template <typename U, U> struct ptrmbr_to_type;
template <typename U>
static yes& test(ptrmbr_to_type<void (T::*)(std::size_t),&U::reserve>*);
template <typename U> static no& test(...);
static const bool value = sizeof(test<T>(0))==sizeof(yes);
};
相关文章:
- 如果 C 函数仍然可以间接执行(通过回调函数),那么将它声明为静态函数是否是一种不好的做法?
- 如果函数采用指向类的指针,则函数将完全脱离候选列表
- 如果函数包含静态变量,为什么编译器不执行内联?
- 如果函数使用 OPENCV Mat 作为输入,如何编写头文件?
- 如果 C函数确实存在,则 C++ 调用它
- 如果函数是在类的主体中定义的,我是否需要在成员函数的返回类型中指定 typename?
- 如何修改此函数,以便如果函数的参数是特定结构,则返回具有较大整数的结构?
- 如果函数按值传递并按值返回,将调用复制构造函数多少次
- 如果函数抛出的异常可能未捕获,如何销毁局部变量?
- 如果函数的返回值将用作右值引用而不是左值,有没有办法使函数具有不同的行为?
- 如果函数C++中满足条件,则完全停止程序
- C 计数如果函数
- 如果函数返回 std::vector<std::string>,是否存在内存泄漏?
- 如果函数是在.cpp中实现的,则出现c++链接错误
- 如果函数 f() 返回一个指针,这是正确的:auto* v = f() 或 auto v = f()
- C++11/14:如果函数存在,则对其进行包装
- 如果函数没有结束运行,则在 5 分钟内停止函数
- 如果函数包含在命名空间中,则"go to beginning of the function"不起作用 (C++)
- 如果函数类型仅依赖于其自己的模板参数,则取决于函数类型
- 如果函数返回值,如何脱离循环