티스토리 뷰

카테고리 없음

Filament CommandBuffer 해석

newpolaris 2020. 5. 10. 10:44

Template argument deduction이 된다는건 대충 알고있었는데,

c++17 이나 필요할줄은 몰랐다

xcode 그냥은 14라 빌드가 안되더라

https://stackoverflow.com/questions/53483124/reference-wrapper-make-pair-vs-class-template-argument-deduction-ctad

#include <tuple>

template <typename ... ARGS>
struct CommandType
{
    using SavedParameters = std::tuple<typename std::decay<ARGS>::type ...>;
    SavedParameters mArgs;

    CommandType(ARGS ... args) : mArgs(std::move(args)...)
    {
    }
};

int main()
{
    int i = 0;
    float f = 0.f;

    CommandType cmd(i, std::ref(f));
    std::tuple<int, float> type = cmd.mArgs;

    return 0;
}

decay는 const, & 을 제거해주고 [] 배열을 *로 바꾸는 작업을 하더라

#include <tuple>

struct Driver
{
    void drawArray(int32_t offset, size_t size) {

    }

    int draw(float a) {
        return 0;
    }
};

template<typename RetType, typename ... ARGS>
struct CommandType;

template <typename RetType, typename ... ARGS>
struct CommandType<RetType(Driver::*)(ARGS...)>
{
    using SavedParameters = std::tuple<typename std::decay<ARGS>::type ...>;
    SavedParameters mArgs;

    CommandType(ARGS ... args) : mArgs(std::move(args)...)
    {
    }
};

int main()
{
    int32_t i = 0;
    size_t s = 1;

    CommandType<decltype(&Driver::drawArray)> cmd(i, s);
    std::tuple<int, size_t> type = cmd.mArgs;

    CommandType<decltype(&Driver::draw)> cmd2(0.f);
    std::tuple<float> type2 = cmd2.mArgs;

    return 0;
}

#include <tuple>

struct Driver
{
    void drawArray(int32_t offset, size_t size) {

    }

    int draw(float a) {
        return 0;
    }
};

template<typename RetType, typename ... ARGS>
struct CommandType;

template <typename RetType, typename ... ARGS>
struct CommandType<RetType(Driver::*)(ARGS...)>
{
    template <RetType(Driver::*)(ARGS...)>
    struct Command
    {
        using SavedParameters = std::tuple<typename std::decay<ARGS>::type ...>;
        SavedParameters mArgs;

        template <typename ... A>
        Command(A&& ... args) : mArgs(std::move(args)...)
        {
        }
    };
};

int main()
{
    int32_t i = 0;
    size_t s = 1;

    CommandType<decltype(&Driver::drawArray)>::Command<&Driver::drawArray> cmd(i, s);
    std::tuple<int, size_t> type = cmd.mArgs;

    CommandType<decltype(&Driver::draw)>::Command<&Driver::draw> cmd2(0.f);
    std::tuple<float> type2 = cmd2.mArgs;

    return 0;
}

#include <type_traits>
#include <algorithm>

namespace t {
namespace detail {
    template <class F, class Tuple, std::size_t... Is>
    decltype(auto) apply_impl(F&& f, Tuple&& tpl, std::index_sequence<Is...> ) {
        return std::forward<F>(f)(std::get<Is>(std::forward<Tuple>(tpl))...);
    }
}

template <class F, class Tuple>
decltype(auto) apply(F&& f, Tuple&& tpl) {
    return detail::apply_impl(std::forward<F>(f),
        std::forward<Tuple>(tpl),
        std::make_index_sequence<std::tuple_size<std::decay_t<Tuple>>::value>{});
}

}

// this will print 3
int f(int, char, double){
    return 0;
}

int main() {
    auto some_args = std::make_tuple(42, 'x', 3.14);
    int r = t::apply(f, some_args); // calls f(42, 'x', 3.14)

}

index_sequence 와 get 을 이용해 arguemnts 를 나열한다

member function은 경우 1번째 요소에 객체를 넣으면 되는듯

tuple_cat를 이용한다

https://stackoverflow.com/questions/44776927/call-member-function-with-expanded-tuple-parms-stdinvoke-vs-stdapply

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크