将模板迁移到c ++ 11可变参数模板

时间:2016-02-15 21:15:32

标签: templates c++11

我有一个看起来像这样的模板:

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 个答案:

答案 0 :(得分: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;
};

我随意选择了最小数量的args为2。