说你有以下内容:
SomeType *x;
std::vector<std::unique_ptr<SomeType>> v;
你想要调用这样的函数:
do_something(v.begin(), v.end(), x);
假设do_something
是模板化的,并且您希望对container<unique_ptr<T>>
的情况进行专门化。即使不是为了专业化,我们也只是说我们想让container
模板化,但总是假设它是unique_ptr
。
我尝试了以下内容:
template<template <typename X, typename Y> class C, typename T, typename Allocator>
inline int do_something(typename C<std::unique_ptr<T>, Allocator>::iterator first,
typename C<std::unique_ptr<T>, Allocator>::iterator last,
const T* value)
{ ... }
但是g ++,clang和cl.exe都无法推断出C
的类型。这里有什么不明确的?我能做些什么呢?
答案 0 :(得分:3)
::
左侧的任何内容都是非推断的上下文。
这里允许在value_type
为std::unique_ptr
的任何迭代器上调用函数。
#include <type_traits>
template <typename T>
struct is_unique_ptr : public std::false_type {};
template <typename T, typename D>
struct is_unique_ptr<std::unique_ptr<T,D>> : public std::true_type {};
template <typename Iter, typename T>
auto do_something(Iter first, Iter last, const T* value) ->
std::enable_if_t<is_unique_ptr<typename std::iterator_traits<Iter>::value_type>
::value, int>
{ ... }
注意,现在不仅包括Container::iterator
,还包括Container::reverse_iterator
以及具有相同value_type
的任何其他“包装器”迭代器。 (但不是Container::const_iterator
。)