tuple_size和来自元组的继承类?

时间:2011-11-01 14:11:14

标签: c++ templates compiler-errors tuples c++11

我有以下代码:

class TR_AgentInfo : public tuple<
                              long long,         //AgentId
                              string,         //AgentIp
                              >
{
public:
TR_AgentInfo() {}
TR_AgentInfo(
  const long long& AgentId,
  const string& AgentIp,
   )
{
    get<0>(*this) = AgentId;
    get<1>(*this) = AgentIp;
}

long long getAgentId() const { return get<0>(*this); }
void setAgentId(const long long& AgentId) { get<0>(*this) = AgentId; }

string getAgentIp() const { return get<1>(*this); }
void setAgentIp(const string& AgentIp) { get<1>(*this) = AgentIp; }
};

现在我想使用这段代码:

int count = tuple_size<TR_AgentInfo>::value;

但是gcc给出了这个错误:

error: incomplete type std::tuple_size<TR_AgentInfo> used in nested name specifier

现在我该怎么办?

2 个答案:

答案 0 :(得分:3)

如果您只想让您的一个班级与std::tuple_size合作,您可以简单地提供专业化:

namespace std
{
  template<> struct tuple_size<TR_AgentInfo>
  {
    static const size_t value = 2;

    // alternatively, `tuple_size<tuple<long long, string>>::value`
    // or even better, `tuple_size<TR_AgentInfo::tuple_type>::value`, #1
  };
}

明确允许您在命名空间std中添加特化,正好适用于像您这样的情况。

如果您的实际类本身是模板化的,您可以简单地用适当的结构替换2。例如,对于建议#1,您可以为您的班级添加tuple_type的typedef。有很多方法可以给这只猫上皮。

答案 1 :(得分:0)

如果你有一个TR_AgentInfo实例,你可以使用函数模板类型推导使其更友好,如下所示:

template <typename... T>
std::size_t get_tuple_size(std::tuple<T...> const &)
{
  return sizeof...(T);
}

并致电

TR_AgentInfo info;
int count = get_tuple_size(info);

否则你需要使用适当的元编程来获得基类,但设施可用。