【问题标题】:tuple_size and an inhereted class from tuple?tuple_size 和从元组继承的类?
【发布时间】:2011-11-01 14:11:14
【问题描述】:

我有以下代码:

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,那为什么是体操呢?
  • 我的代码过于简化了!这些代码将由我自己制作的一个 TemplateGenerator 生成,然后在另一个非常通用的模板库中使用。
  • 为什么不将元组大小存储为静态类常量?或者 typedef 元组,以便您以后可以使用 std::tuple_size&lt;MyClass::tuple_type&gt;::value?
  • 我希望子类有像元组一样的行为。
  • 如果您的课程已完成,请说namespace std { template&lt;&gt; struct tuple_size&lt;TR_AgentInfo&gt; { static const size_t value = 2; }; }。明确允许向命名空间添加特化。

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


【解决方案1】:

如果你只想让你的一个班级使用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 添加到您的班级。给这只猫剥皮的方法有很多。

【讨论】:

    【解决方案2】:

    如果你有一个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);
    

    否则您需要使用适当的元编程来获得基类,但可用的工具。

    【讨论】:

    • 我不想在基类中得到它。我需要使用 tuple_size
    • 您要求的不是元组的类的 tuple_size。基类是一个元组。您可以获得该基类的 tuple_size 。还是我错过了什么?
    • 我要获取子类的tuple_size
    • 你觉得有什么区别?这里的子类与基类在什么意义上是不同的元组?毕竟,您使用公共继承来显式表达 IS-A 关系,即说 TR_AgentInfo is a tuple&lt;long long, string&gt;
    猜你喜欢
    • 1970-01-01
    • 2017-07-12
    • 2022-01-18
    • 2010-12-21
    • 1970-01-01
    • 1970-01-01
    • 2016-09-21
    • 2020-03-19
    • 2011-01-10
    相关资源
    最近更新 更多