首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将模板迁移到c++11可变模板

将模板迁移到c++11可变模板
EN

Stack Overflow用户
提问于 2016-02-15 21:15:31
回答 1查看 48关注 0票数 1

我有一个像这样的模板:

代码语言:javascript
复制
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个参数来引导我吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-02-15 21:31:26

下面是一个近似,但我使用的是这里记录的hash_append

N3980

演示

幻灯片

github图书馆

这使得事情变得更简单更灵活。

代码语言:javascript
复制
#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的数目。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35419230

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档