sapporocpp / mokumoku

0 stars 0 forks source link

2019/07/31 もくもく会 #178 #182

Open maraigue opened 5 years ago

maraigue commented 5 years ago

引き続き、「要素取得も挿入・削除も対数時間でできるリスト構造」を実装する。 イテレータ自体の実装を完成させるとともに、リスト構造のメソッドでイテレータを使う箇所を実装する。 とりあえず、イテレータを使っての要素挿入・削除は実装したい(サンプルコードを書きやすくなるので)

ignisan commented 5 years ago

前回わからなかったメタ関数を調べる

ignisan commented 5 years ago

できた https://wandbox.org/permlink/2vBaWzTFpH9CrrWt

#include<iostream>
#include<type_traits>

template<template<class> class A,
         template<class> class B,
         class T, class V>
constexpr bool check(A<T>, B<V>) {
    return std::is_same<A<T>, B<T>>::value;
}

template<class T> struct holder1 { };
template<class T> struct holder2 { };

int main() {
    std::cout << "holder1<int> . holder1<char> = "
              << check(holder1<int>(), holder1<char>()) << std::endl;

    std::cout << "holder1<int> . holder2<int>  = "
              << check(holder1<int>(), holder2<int>()) << std::endl;
}
maraigue commented 5 years ago

実装しないとならない関数が多すぎるが順次実装している

ignisan commented 5 years ago

holder1のコンストラクタがprivateだと通らなかったのでupdate

#include<iostream>
#include<type_traits>

template<template<class...> class A,
         template<class...> class B,
         class... T,class... V>
constexpr auto is_same_holder_impl(A<T...>, B<V...>) noexcept {
    return std::is_same<A<T...>, B<T...>>();
}

template<class A, class B>
struct is_same_holder
    : decltype(is_same_holder_impl(std::declval<A>(), std::declval<B>()))
{ };

template<class... T> class holder1 {
    holder1(){}
};
template<class... T> struct holder2 { };

int main() {
    static_assert( is_same_holder<holder1<int,int>, holder1<char>>::value);
    static_assert(!is_same_holder<holder2<int,int>, holder1<char>>::value);
}