• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Konkatenacja i parameter pack'i problem z wielokropkiem

Object Storage Arubacloud
–1 głos
328 wizyt
pytanie zadane 21 marca 2016 w C i C++ przez 0xf Dyskutant (8,180 p.)
Czesc pisze sobie funkcja ktora ma za zadanie skonkatenowac wiele rzeczy ze soba.
Przejde do sedna chcialbym zeby w main'ie sobie taka funkcje wywolac z rozna iloscia parametrow czyli to co wrzucam przy wywolaniu funkcji ma zostac skonkatenowane z tym co mam w funkcji a nastepnie ten napis ma zostac wyslany innej funkcji. 
Ale mam problem przy kompilacji kod wrzucam ponizej i dodam ze mam ustawiony w IDE kompilator C++14

#include "TabelaSQL.hpp"

using namespace std;
using namespace pqxx;

template <typename First, typename... Rest> void TabelaPostgre::create(const First& first, const Rest&... rest)  
{
    create(rest...);
    string sql="CREATE TABLE "+create(rest...);
    work W(C);
    W.exec(sql);
    W.commit();
}

TabelaPostgre::~TabelaPostgre()
{
    cout<<"Dzialam"<<endl;
    C.disconnect();
}

int main()
{
    cout<<"hehe"<<endl;
    TabelaPostgre *Obiekt=new TabelaPostgre("marcel","postgres","haslo","127.0.0.1","5432");
    TabelaPostgre::create("first");
    delete Obiekt;
    return 0;
}

 

TabelaPostgre.cpp|45|error: cannot call member function ‘void TabelaPostgre::create(const First&, const Rest& ...) [with First = char [6]; Rest = {}]’ without object|

Prosilbym o wytlumaczenie dodam ze parameter pack'ow ucze sie stad : https://msdn.microsoft.com/pl-pl/library/dn439779.aspx

Pozdrawiam

 

1 odpowiedź

0 głosów
odpowiedź 21 marca 2016 przez Radfler VIP (101,030 p.)
przywrócone 30 marca 2016 przez Radfler

Chwila... w linijce 13:

string sql="CREATE TABLE "+create(rest...);

Wywołujesz tu funkcję create, a ta zwraca void. To nie ma prawa działać, nie ma czegoś takiego jak dodawanie 'voidów'.

#PS Jeżeli chodzi o parameter packi to tu masz lepsze opisy:

http://en.cppreference.com/w/cpp/language/parameter_pack

http://en.cppreference.com/w/cpp/language/fold

komentarz 21 marca 2016 przez 0xf Dyskutant (8,180 p.)

Wiem ze to nie ma zbytnio sensu bo wczesniej sobie napisalem tylko rest... ale dostawalem taki blad 

error: parameter packs not expanded with '...':

Wiec sprobowalem inaczej byle sie kompilowalo ale nic

komentarz 21 marca 2016 przez Radfler VIP (101,030 p.)
To pokaż jak wcześniej robiłeś, bo to co teraz jest nie ma sensu...
komentarz 22 marca 2016 przez 0xf Dyskutant (8,180 p.)
string sql="CREATE TABLE "+rest...;
komentarz 22 marca 2016 przez Radfler VIP (101,030 p.)

Dobra, tak rzeczywiście nie możesz. Praca z parameter packiem jest dosyć trudna, więc podeślę Ci moją wersję funkcji łączącej napisy: http://pastebin.com/0cS6wzcW

Ogólnie radzę Ci zrealizować taką funkcję do łączenia wielu napisów jako globalną (nieskładową). Oszczędzi Ci to problemów z szablonami na przyszłość.

#PS Sprawdź czy Twój kompilator wspiera fold expressions. Możliwe, że Twój problem można rozwiązać znacznie prościej.

komentarz 22 marca 2016 przez 0xf Dyskutant (8,180 p.)
Jakie mozliwosci daje biblioteka utility ?
komentarz 22 marca 2016 przez Radfler VIP (101,030 p.)

Daje funkcje std::forward oraz wiele innych przydatnych narzędzi (http://en.cppreference.com/w/cpp/header/utility).

komentarz 24 marca 2016 przez 0xf Dyskutant (8,180 p.)

Ok jeszcze jedno pytane czytajac ten kod nie rozumiem tej linii. 

return std::forward<Head>(head) + make_string(std::forward<Tail>(tail)...);

to tak return rozumiem

std::forward tez 

Ale <Head>(head) juz nie mi to wyglada na szablon funkcji ale nie rozumiem dlaczego tutaj jest szablon funkcji. 

Dalej rozumiem az do tad <Tail>(tail)...); nie rozumiem przede wszystkim tego (tail)...)

Prosilbym o wytlumaczenie.

Pozdrawiam 

komentarz 24 marca 2016 przez Radfler VIP (101,030 p.)

Funkcja std::forward: http://en.cppreference.com/w/cpp/utility/forward

I jak widzisz jest to szablon funkcji, z którego korzystamy aby nie było problemów z kategorią wartości (value category).

To wyrażenie (tail)... to zwykłe rozpakowanie parameter packa, nic niezwykłego.

Podobne pytania

0 głosów
1 odpowiedź 180 wizyt
pytanie zadane 2 marca 2016 w C i C++ przez 0xf Dyskutant (8,180 p.)
0 głosów
1 odpowiedź 321 wizyt
pytanie zadane 27 lutego 2017 w HTML i CSS przez Haroy Użytkownik (550 p.)
0 głosów
1 odpowiedź 177 wizyt

92,684 zapytań

141,589 odpowiedzi

320,073 komentarzy

62,044 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...