2016-02-15 4 views
1

У меня есть шаблон, который выглядит следующим образом:перенести шаблон C++ 11 VARIADIC шаблон

template <typename T, typename ARG1, typename ARG2> 
class Base 
{ 
public: 
    Base(const std::shared_ptr<ARG1>& arg1, const std::shared_ptr<ARG2>& arg2) 
     : mArg1(arg1) 
     , mArg2(arg2) 
    { 
    } 

    struct Hasher 
    { 
     std::size_t operator()(const std::shared_ptr<T>& object) const 
     { 
      std::hash<std::shared_ptr<ARG1>> hash1; 
      auto seed = hash1(object->mArg1); 

      std::hash<std::shared_ptr<ARG2>> hash2; 
      boost::hash_combine(seed, hash2(object->mArg2)); 

      return seed; 
     } 

     bool operator()(const std::shared_ptr<T>& object1, 
         const std::shared_ptr<T>& object2) const 
     { 
      return object1->mArg1 == object2->mArg1 && object1->mArg2 == object2->mArg2; 
     } 
    }; 

protected: 
    std::shared_ptr<ARG1> mArg1; 
    std::shared_ptr<ARG2> mArg2; 
}; 

Я новичок в шаблоны с переменным числом C++ 11. Может кто-нибудь немного меня запомнит, как этот шаблон будет похож на поддержку N аргументов - если это возможно.

+1

Использование 'кортежа ...>'. –

ответ

3

Вот приближение, но я использую hash_append описываемая здесь:

N3980

Presentation

Slides

github library

, что делает вещи проще и гораздо более гибкий.

#include "hash_append.h" 
#include <memory> 
#include <tuple> 

template <typename T, typename ARG1, typename ARG2, typename ...Args> 
class Base 
{ 
public: 
    Base(const std::shared_ptr<ARG1>& arg1, const std::shared_ptr<ARG2>& arg2, 
     const std::shared_ptr<Args>& ...args) 
     : mArgs(arg1, arg2, args...) 
    { 
    } 

    template <class H> 
    friend 
    void 
    hash_append(H& h, const Base& b) 
    { 
     hash_append(h, b.mArgs); 
    } 

protected: 
    std::tuple<std::shared_ptr<ARG1>, std::shared_ptr<ARG2>, 
       std::shared_ptr<Args>...> mArgs; 
}; 

Я произвольно выбрал минимальное число аргументов, как 2.

+0

спасибо, кортеж, похоже, работает – gsf

Смежные вопросы