tuple_size и встроенный класс из кортежа? - PullRequest
2 голосов
/ 01 ноября 2011

У меня есть следующий код:

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 ]

3 голосов
/ 02 ноября 2011

Если вы хотите, чтобы ваш один класс работал с 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 вы можете добавить typedef для tuple_type в ваш класс. Есть много способов снять кожу с этой кошки.

0 голосов
/ 01 ноября 2011

Если у вас есть экземпляр 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);

в противном случае вам нужно использовать правильное метапрограммирование, чтобы добраться до базового класса, но возможности доступны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...