在他今年的“Going Native”主题演讲中C++ 的本质 http://channel9.msdn.com/Events/GoingNative/2013/Opening-Keynote-Bjarne-Stroustrup(转至 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>
到处。
EDIT
正如斯特凡在很快的回答中所建议的,您可以使用以下命令更轻松地做到这一点std::begin
这没关系,因为您使用/创建的任何容器都希望能够调用std::begin
and std::end
无论如何:
template <class C>
using Value_Type = typename std::remove_reference<
decltype(*std::begin(std::declval<
typename std::add_lvalue_reference<C>::type>()))>::type;
尽管读起来有点密集,但它更加简洁。它仍然比第一个选项更好,这将需要更少的自定义容器类型的样板代码。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)