• 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

0 głosów
658 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 (158,940 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 (158,940 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 (158,940 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 302 wizyt
pytanie zadane 24 września 2019 w C i C++ przez Teslum_369 Gaduła (4,190 p.)
+1 głos
1 odpowiedź 510 wizyt
pytanie zadane 21 maja 2015 w C i C++ przez Radfler VIP (101,030 p.)
0 głosów
2 odpowiedzi 595 wizyt
pytanie zadane 4 marca 2018 w C i C++ przez Mateusz Tocha Bywalec (2,560 p.)

93,631 zapytań

142,553 odpowiedzi

323,056 komentarzy

63,139 pasjonatów

Advent of Code 2025

Top 15 użytkowników

  1. 2900p. - dia-Chann
  2. 2870p. - DziarnowskiJ
  3. 2827p. - Łukasz Piwowar
  4. 2783p. - raydeal
  5. 2758p. - Adrian Wieprzkowicz
  6. 2713p. - rucin93
  7. 2579p. - Łukasz Eckert
  8. 2459p. - CC PL
  9. 2184p. - Maurycy W
  10. 2082p. - Michal Drewniak
  11. 1885p. - robwarsz
  12. 1811p. - rafalszastok
  13. 1600p. - Rafał Trójniak
  14. 1588p. - Tomasz Bielak
  15. 1494p. - ssynowiec
Szczegóły i pełne wyniki

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

Kursy INF.02 i INF.03
...