模板参数的模板化模板特化

时间:2017-05-04 20:45:33

标签: c++ c++11

说你有以下内容:

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的类型。这里有什么不明确的?我能做些什么呢?

1 个答案:

答案 0 :(得分:3)

::左侧的任何内容都是非推断的上下文。

这里允许在value_typestd::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。)