SORU
5 HAZİRAN 2011, Pazar


Oldukça baskı::std demet

Bu bir takip için çok şık ve tamamen genel bir çözüm geliştirmeyi başardık ** 16 yaşında, daha önceki soruma.


Bu bir sonraki adım, çok baskı std::tuple<Args...>, variadic şablonları kullanarak (yani bu kesinlikle C 11) eklemek istiyorum. std::pair<S,T>, ben sadece demek

std::ostream & operator<<(std::ostream & o, const std::pair<S,T> & p)
{
  return o << "(" << p.first << ", " << p.second << ")";
}

Bir demet yazdırma için benzer yapı nedir?

Şablon çeşitli bit yığın açma, endeks etrafında geçen ve SFİNAE son elemanı olduğum zaman keşfetmek için argüman kullanarak denedim, ama hiçbir başarı elde ettik. Benim kırık kodu ile yükü etmeyeceğim; sorun açıklaması umarım yeterince basittir. Aslında, aşağıdaki davranış istiyorum:

auto a = std::make_tuple(5, "Hello", -0.1);
std::cout << a << std::endl; // prints: (5, "Hello", -0.1)

Bonus genellik (/wchar_t, çift sınırlayıcı char) bir önceki soru olarak aynı seviyede olmak üzere puan!

CEVAP
5 HAZİRAN 2011, Pazar


, indices~ Yay

namespace aux{
template<std::size_t...> struct seq{};

template<std::size_t N, std::size_t... Is>
struct gen_seq : gen_seq<N-1, N-1, Is...>{};

template<std::size_t... Is>
struct gen_seq<0, Is...> : seq<Is...>{};

template<class Ch, class Tr, class Tuple, std::size_t... Is>
void print_tuple(std::basic_ostream<Ch,Tr>& os, Tuple const& t, seq<Is...>){
  using swallow = int[];
  (void)swallow{0, (void(os << (Is == 0? "" : ", ") << std::get<Is>(t)), 0)...};
}
} // aux::

template<class Ch, class Tr, class... Args>
auto operator<<(std::basic_ostream<Ch, Tr>& os, std::tuple<Args...> const& t)
    -> std::basic_ostream<Ch, Tr>&
{
  os << "(";
  aux::print_tuple(os, t, aux::gen_seq<sizeof...(Args)>());
  return os << ")";
}

Live example on Ideone.


Sınırlayıcı şeyler için, sadece bu kısmi uzmanlık ekleyin:

// Delimiters for tuple
template<class... Args>
struct delimiters<std::tuple<Args...>, char> {
  static const delimiters_values<char> values;
};

template<class... Args>
const delimiters_values<char> delimiters<std::tuple<Args...>, char>::values = { "(", ", ", ")" };

template<class... Args>
struct delimiters<std::tuple<Args...>, wchar_t> {
  static const delimiters_values<wchar_t> values;
};

template<class... Args>
const delimiters_values<wchar_t> delimiters<std::tuple<Args...>, wchar_t>::values = { L"(", L", ", L")" };

ve değişim operator<< print_tuple buna göre:

template<class Ch, class Tr, class... Args>
auto operator<<(std::basic_ostream<Ch, Tr>& os, std::tuple<Args...> const& t)
    -> std::basic_ostream<Ch, Tr>&
{
  typedef std::tuple<Args...> tuple_t;
  if(delimiters<tuple_t, Ch>::values.prefix != 0)
    os << delimiters<tuple_t,char>::values.prefix;

  print_tuple(os, t, aux::gen_seq<sizeof...(Args)>());

  if(delimiters<tuple_t, Ch>::values.postfix != 0)
    os << delimiters<tuple_t,char>::values.postfix;

  return os;
}

Ve

template<class Ch, class Tr, class Tuple, std::size_t... Is>
void print_tuple(std::basic_ostream<Ch, Tr>& os, Tuple const& t, seq<Is...>){
  using swallow = int[];
  char const* delim = delimiters<Tuple, Ch>::values.delimiter;
  if(!delim) delim = "";
  (void)swallow{0, (void(os << (Is == 0? "" : delim) << std::get<Is>(t)), 0)...};
}

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • spederson7

    spederson7

    17 Temmuz 2006
  • Stevie

    Stevie

    2 Mayıs 2010
  • WoodysGamertag

    WoodysGamert

    17 Aralık 2009