gpt4 book ai didi

c++ - template 模板类,如果存在就调用一个函数

转载 作者:搜寻专家 更新时间:2023-10-31 00:28:55 25 4
gpt4 key购买 nike

我有一个带有模板模板参数的简单函数。它意味着采用 STL 容器,将智能 ptr 转换为普通 ptr(这是一个 C++03 项目,但我也对 C++11 的答案感兴趣):

template <template <typename _T, typename = std::allocator<_T> > class Container>
static Container<T*> GetRawPtrContainer(const Container<SmartPtr<T> >& input_container)
{
Container<T*> container;
for(typename Container<SmartPtr<T> >::const_iterator it = input_container.begin();
it != input_container.end();
it++)
{
container.push_back(it->ptr);
}
return container;
}

这是SmartPtr<T>类的静态成员函数.

你看这里,所有这一切都是push_back input_container 中的所有元素到另一个并返回。

您可能已经注意到,如果输入是 std::vector ,那么 O(1) 存在性能问题插入,虽然这对 std::list 没问题和 std::deque .所以我想做的是如果可能的话(在编译时决定)在循环之前调用它:

container.reserve(input_container.size());

我该怎么做?

最佳答案

检查class是否有reserve函数:

C++03:

template<typename T> struct HasReserve {
struct Fallback { void reserve(size_t); };
struct Derived : T, Fallback { };

template<typename C, C> struct Check;

template<typename C> static char(&f(Check<void (Fallback::*)(size_t), &C::reserve>*))[1];
template<typename C> static char(&f(...))[2];

static bool const value = sizeof(f<Derived>(0)) == 2;
};

C++11:

template <typename T, typename = int>
struct HasReserve : std::false_type { };

template <typename T>
struct HasReserve <T, decltype(&T::reserve, 0)> : std::true_type { };

如果可能调用reserve的函数:

template<typename T>
typename std::enable_if<HasReserve<T>::value>::type
Reserve(T& container, size_t s)
{
container.reserve(s);
}

template<typename T>
typename std::enable_if<!HasReserve<T>::value>::type
Reserve(T&, size_t)
{
}

只需在循环之前调用 Reserve 函数,它就会像您希望的那样工作。

template <template <typename _T, typename = std::allocator<_T> > class Container>
static Container<T*> GetRawPtrContainer(const Container<SmartPtr<T> >& input_container)
{
Container<T*> container;
Reserve(container, input_container.size()); // just add this to your function
for(typename Container<SmartPtr<T> >::const_iterator it = input_container.begin();
it != input_container.end();
it++)
{
container.push_back(it->ptr);
}
return container;
}

C++03 的 std::enable_if

template<bool B, class T = void>
struct enable_if {};

template<class T>
struct enable_if<true, T> { typedef T type; };

关于c++ - template 模板类,如果存在就调用一个函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43317175/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com