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

Domyślny argument dla referencji tablicy std::array

Object Storage Arubacloud
0 głosów
360 wizyt
pytanie zadane 24 marca 2018 w C i C++ przez Mateusz Tocha Bywalec (2,560 p.)

Cześć w jaki sposób zdefiniować domyślną referencje do tablicy std::array tak żebym nie musiał podawać argumentu color podczas wywoływania funkcji, czy sprawę blokuje tutaj szablon?

 

próbowałem std::array<_Tp, _SIZE_COLOR> & color=(std::array<float,8>{}) , i używam jako:

this->rawModel = loader.loadToVAO<float>(arrayPosition);  ale nie działa.

 

co ciekawe jak zrobię to tak:

std::array<float,8> color={};

std::array<float, 8> arrayPosition=this->createVertexPosition(position);

this->rawModel = loader.loadToVAO<float>(arrayPosition,color);

to jest ok.

template <typename _Tp, std::size_t _SIZE_POSITION, std::size_t _SIZE_COLOR>
    std::shared_ptr<RawModel> loadToVAO(std::array<_Tp, _SIZE_POSITION> & position, std::array<_Tp, _SIZE_COLOR> & color)
    {
        VertexArray *vao = new VertexArray();
        vao->Bind();
        VertexBuffer *vbo = new VertexBuffer(position._M_elems, sizeof(_Tp) * position.size());
        VertexBufferLayout layout;
        layout.Push<_Tp>(2);
        vao->AddBuffer(vbo, layout);

        VertexBuffer *vbo_color=new VertexBuffer(color._M_elems, sizeof(_Tp)*color.size());
        
        VertexBufferLayout layout2;
        layout2.Push<_Tp>(3);
        vao->AddBuffer(vbo_color, layout2);      

        std::shared_ptr<RawModel> rawModel(new RawModel());
        rawModel->addVAO(vao);
        return rawModel;
    }

czy lepszym rozwiązaniem ze względu na to że używam templatu to moze overload?

 

Pozdrawiam

 

komentarz 24 marca 2018 przez mokrowski Mędrzec (155,460 p.)

Dobrze Cię zrozumiałem? Domyślną wartość do referencji czyli taką która wystąpi jeśli nie będzie podana żadna???

komentarz 24 marca 2018 przez Mateusz Tocha Bywalec (2,560 p.)
tak
komentarz 24 marca 2018 przez mokrowski Mędrzec (155,460 p.)
No to przeczytaj jeszcze raz pogrubione. Co ma zrobić kompilator jak nic nie podasz? Ma zrobić Ci obiekt r-value? Na co FIZYCZNEGO (w sensie zmiennej) ma wskazać ta referencja?
komentarz 24 marca 2018 przez Mateusz Tocha Bywalec (2,560 p.)
No miałaby być na referencje tablicy pustej std::array<float,8>

jeżeli jest to const reference to powinno zadziałać.
komentarz 24 marca 2018 przez Mateusz Tocha Bywalec (2,560 p.)

problemem raczej (tak mi sie wydaje) jest to ze ten template pozwala na wrzucenie tablicy bez podawania jawnie ilosci elementów

 

bo cos takiego powinno zadziałać:

static int AVAL = 1;

void f( int & x = AVAL ) {
   // stuff
} 

int main() {
     f();       // equivalent to f(AVAL);
}

a krzyczy w moim przypadku że:

note: couldn't deduce template parameter '_SIZE_COLOR'

czyli jakby w template się nie domyślał jaką tablice podaje jako argument domyślny

 

komentarz 24 marca 2018 przez mokrowski Mędrzec (155,460 p.)

No ale u Ciebie nie było stałej :)

Jeśli ze stałą to (poobcinany Twój przykład):

#include <memory>
#include <array>
#include <iostream>

struct RawModel {
};

template <typename _Tp, std::size_t _SIZE_POSITION, std::size_t _SIZE_COLOR = 8>
    std::shared_ptr<RawModel> loadToVAO(std::array<_Tp, _SIZE_POSITION> & position, const std::array<_Tp, _SIZE_COLOR>& color = std::array<float, _SIZE_COLOR>())
    {
        std::shared_ptr<RawModel> rawModel(new RawModel());
        return rawModel;
    }

int main() {
    std::array<float, 10> ar = {{}};
    auto vo = loadToVAO<float>(ar);
}

Dla sprawdzenia całego kontekstu i ew. sensu, za mało kodu...

komentarz 24 marca 2018 przez Mateusz Tocha Bywalec (2,560 p.)
racja sorry, nie spojrzałem, ale niestety dalej nie działa.
komentarz 24 marca 2018 przez Mateusz Tocha Bywalec (2,560 p.)

rozwiązałem to w mało elegancki sposób

 

#pragma once
#include "RawModel.h"
#include <memory>
#include <array>


 static std::array<float,8> COLOR={};
class Loader
{
  public:
    Loader();
     ~Loader();
    std::shared_ptr<RawModel> loadToVAO(const void *position, const void *color);

    template <typename _Tp, std::size_t _SIZE_POSITION, std::size_t _SIZE_COLOR>
    std::shared_ptr<RawModel> loadToVAO(const std::array<_Tp, _SIZE_POSITION> & position,const std::array<_Tp, _SIZE_COLOR> & color=COLOR)
    {
        VertexArray *vao = new VertexArray();
        vao->Bind();
        VertexBuffer *vbo = new VertexBuffer(position._M_elems, sizeof(_Tp) * position.size());
        VertexBufferLayout layout;
        layout.Push<_Tp>(2);
        vao->AddBuffer(vbo, layout);

        VertexBuffer *vbo_color=new VertexBuffer(color._M_elems, sizeof(_Tp)*color.size());
        
        VertexBufferLayout layout2;
        layout2.Push<_Tp>(3);
        vao->AddBuffer(vbo_color, layout2);      

        std::shared_ptr<RawModel> rawModel(new RawModel());
        rawModel->addVAO(vao);
        return rawModel;
    }

   
    template <typename _Tp, std::size_t _SIZE_POSITION>
    std::shared_ptr<RawModel> loadToVAO(const std::array<_Tp, _SIZE_POSITION> & position)
    {
       return this->loadToVAO<float>(position, COLOR);
    }
    

  private:
    VertexArray createVAO(const void *position, const void *color);
     
};

template <typename V, typename... T>
constexpr auto array_of(T &&... t)
    -> std::array<V, sizeof...(T)>
{
    return {{std::forward<T>(t)...}};
}

 

Zaloguj lub zarejestruj się, aby odpowiedzieć na to pytanie.

Podobne pytania

0 głosów
2 odpowiedzi 180 wizyt
pytanie zadane 24 września 2019 w C i C++ przez Teslum_369 Gaduła (4,190 p.)
+1 głos
1 odpowiedź 378 wizyt
pytanie zadane 21 maja 2015 w C i C++ przez Radfler VIP (101,030 p.)
0 głosów
2 odpowiedzi 306 wizyt
pytanie zadane 4 marca 2018 w C i C++ przez Mateusz Tocha Bywalec (2,560 p.)

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

61,961 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

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

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!

...