티스토리 뷰
Template argument deduction이 된다는건 대충 알고있었는데,
c++17 이나 필요할줄은 몰랐다
xcode 그냥은 14라 빌드가 안되더라
#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를 이용한다
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크