Я прохожу через Herb Sutter's
Путешествие: к более мощному и простому программированию на C++
Чтобы понять концепцию. Лучше всего написать программу, которую я пробовал, но получаю какую-то ошибку.
Просто хочу попробовать, как использовать привязку структуры к классу с частными данными. Пожалуйста, игнорируйте приведенный ниже пример. Если какой-либо пример вы можете предоставить
#include<iostream>
#include<string>
using namespace std;
class foobar {
public:
foobar() { cout << "foobar::foobar()\n"; }
~foobar() { cout << "foobar::~foobar()\n"; }
foobar( const foobar &rhs )
{ cout << "foobar::foobar( const foobar & )\n"; }
void ival( int nval, string new_string ) { _ival = nval;s=new_string; }
private:
int _ival;
string s;
};
foobar f( int val,string new_string ) {
foobar local;
local.ival( val,new_string );
return local;
}
template<> struct tuple_element<0,foobar> { using type = int; };
template<> struct tuple_element<1,foobar> { using type = string; };
// 2. Now add get<> support (using C++17, because why not; it’s better
// than =delete’ing the primary get<> template and adding specializations)
template<int I>
auto get(const foobar&x) {
if constexpr(I == 0) return x._ival;//'_ival' is a private member of 'foobar'
else if constexpr(I == 1) return x.s;//'s' is a private member of 'foobar'
}
int main(){
foobar ml = f( 1024,"hello" );
auto [ n, s] = f( 1024,"hello" );//Cannot decompose non-public member '_ival' o
return 0;
}
Ошибка
if constexpr(I == 0) return x._ival;//'_ival' является закрытым членом 'foobar'
иначе, если constexpr(I == 1) возвращает x.s;//'s' является закрытым членом 'foobar'
auto [ n, s] = f( 1024,"hello" );//Невозможно разложить непубличный
Требуется помощь
1. Если кто-нибудь может уточнить, что он на самом деле пытается сделать в этих строках (пожалуйста, обратитесь по предоставленной ссылке)
// 2. Now add get<> support (using C++17, because why not; it’s better
// than =delete’ing the primary get<> template and adding specializations)
template<int I>
auto get(const S&) {
if constexpr(I == 0) return x.i;
else if constexpr(I == 1) return string_view{x.c}; }
else if constexpr(I == 2) return x.d;
}
2. Любое предложение, как исправить ошибку для приведенного выше примера
get
пытается получить доступ к закрытым членам класса. - person Igor Tandetnik   schedule 26.08.2017