gpt4 book ai didi

c++ - 容器模板参数的 value_type

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:01:56 26 4
gpt4 key购买 nike

在他今年 Going Native 的主题演讲中 The Essence of C++ (转到 40:30)Bjarne Stroustrup 给出了以下代码示例:

template<typename C, typename V>
vector<Value_type<C>*> find_all(C& cont, V v)
{
vector<Value_type<C>*> res;

for (auto& x : cont)
if (x == v)
res.push_back(&x)

return res;
}

此函数用于查找容器中所有出现的值并返回指向找到的元素的指针。视频中的示例:

string m{"Mary had a little lamb"}; 
for (const auto p: find_all(m,'a')) // p is a char*
if (*p != 'a')
cerr << "string bug!\n";

我的问题是关于 Value_Type<C>* 。标准中有这样的东西吗图书馆?我找了找没找到。如果不在 std 中,如何实现?

最佳答案

我不知道标准中有这个,但实现起来并不难:

    template <class C>
struct value_type
{
typedef typename C::value_type type;
};

template <class T, int N>
struct value_type<T[N]>
{
typedef T type;
};

template <class T>
struct value_type<T*>
{
typedef T type;
};

现在您可以使用 typename value_type<C>::type访问容器包含的类型。如果你有自己的容器,你想使用但它没有 value_type typedef(无论出于何种原因您无法更改它),那么您也可以简单地将此结构专门用于该容器。

为了避免 typename ...::type你可以这样做:

    template <class C>
using Value_Type = typedef value_type<C>::type;

现在你只需使用 Value_Type<C>无处不在。

编辑
正如斯特凡在很快的回答中所建议的那样,您可以使用 std::begin 更轻松地做到这一点。这没关系,因为您使用/创建的任何容器都希望能够调用 std::beginstd::end无论如何:

    template <class C>
using Value_Type = typename std::remove_reference<
decltype(*std::begin(std::declval<
typename std::add_lvalue_reference<C>::type>()))>::type;

虽然读起来有点密集,但要简洁得多。它仍然比第一个选项更好,这将需要更少的自定义容器类型样板代码。

关于c++ - 容器模板参数的 value_type,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19931199/

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