我有一个看起来像这样的模板:
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个参数的方式来引导我一点。答案 0 :(得分:3)
这是一个近似值,但我在此处记录了hash_append
:
使事情变得更简单,更灵活。
#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。