代码之家  ›  专栏  ›  技术社区  ›  smerlin

如何获取延迟模板参数的类型

  •  2
  • smerlin  · 技术社区  · 14 年前

    是否有方法获取类模板参数的延迟类型?

    template <class TPtr>
    struct foo {
        typedef TPtr ptr_type;
        typedef ??? element_type; /* shall be the type of a deferred TPtr*/
    };
    

    所以 foo<const char*>::element_type 结果在 const char foo<std::vector<int>::iterator_type>::element_type 结果在 int .

    我知道我可以使用 value_type C++迭代器的Type std::vector<int>::iterator_type::value_type ,但原始指针没有值“typedef”,因此我在那里不走运。

    1 回复  |  直到 14 年前
        1
  •  4
  •   In silico    14 年前

    如果 TPtr 只能是指针 ,你在找 Boost's remove_pointer .

    如果您想知道在这个工作的世界中是如何工作的,它会以这种方式使用部分专业化:

    template<typename T>
    struct RemovePointer;
    
    template<typename T>
    struct RemovePointer<T*>
    {
        typedef T Type;
    };
    
    int main()
    {
        RemovePointer<int*>::Type foobar; // foobar has the type int
        return 0;
    }
    

    如果 TPTR 可以是迭代器或指针 你需要 the iterator_traits class 是标准库的一部分。在您的情况下,它的用法如下:

    template <class TPtr> 
    struct foo { 
        typedef TPtr ptr_type;
        // The compiler won't know for sure if value_type is actually
        // a type until TPtr is known. The typename keyword is a hint
        // to the compiler so it doesn't cause an error.
        typedef typename iterator_traits<TPtr>::value_type element_type;
    };
    

    信不信由你,它也通过部分专业化运作。基本上是这样定义的:

    // Primary template for iterators
    
    template<class Iterator>
    struct iterator_traits
    {
        typedef typename Iterator::difference_type difference_type;
        typedef typename Iterator::value_type value_type;
        typedef typename Iterator::pointer pointer;
        typedef typename Iterator::reference reference;
        typedef typename Iterator::iterator_category iterator_category;
    };
    
    // Partial specializations for pointers
    
    template<class T>
    struct iterator_traits<T*>
    {
        typedef ptrdiff_t difference_type;
        typedef T value_type;
        typedef T* pointer;
        typedef T& reference;
        typedef random_access_iterator_tag iterator_category;
    };
    
    template<class T>
    struct iterator_traits<const T*>
    {
        typedef ptrdiff_t difference_type;
        typedef T value_type;
        typedef const T* pointer;
        typedef const T& reference;
        typedef random_access_iterator_tag iterator_category;
    };
    

    这就是为什么 迭代器性状 类同时在迭代器和指针上工作。