More Related Content
Similar to Tickライブラリで遊ぼう(C++)
Similar to Tickライブラリで遊ぼう(C++) (20)
Tickライブラリで遊ぼう(C++)
- 8. Tick解説
マクロを展開してみる!
8
!
struct tick_private_trait_base_is_incrementable
: tick::ops {
typedef tick::refines<> type;
};
struct tick_private_trait_is_incrementable;
template<class... T>
struct is_incrementable :
tick::models<tick_private_trait_is_incrementable(T...)> {};
!
struct tick_private_trait_is_incrementable :
tick::detail::base_requires, tick::ops,
tick_private_trait_base_is_incrementable::type
{
template<class T>
auto requires_(T&& x)
-> decltype(tick::detail::valid_expr((x++, ++x,
tick::detail::void_())));
};
- 9. Tick解説
わかりにくいので書き換え!
!
!
!
!
!
!
!
9
template<class... Ts>
struct holder { using type = void; };
!
template <class Trait, class X = void>
struct models : false_type {};
!
template <class Trait, class T>
struct models<Trait(T),
typename holder<
decltype(declval<Trait>().requires_(declval<T>()))
>::type>
: true_type {};
!
struct is_incrementable_impl
{
template <class T>
auto requires_(T&& x) -> decltype(x++, ++x);
};
!
template <class T>
struct is_incrementable : models<is_incrementable_impl(T)> {};
- 11. Tick解説(削除ページ)
補足: この場合はこう書いたほうが楽!
8
!
struct is_incrementable_impl {
template <class T>
static auto check(T*) -> decltype(
std::declval<T&>()++, ++std::declval<T&>(),
std::true_type());
!
static auto check(...) -> std::false_type;
};
!
template <class T>
struct is_incrementable
: decltype(is_incrementable_impl::check<T>(nullptr))
{};
- 16. Tick解説
• 多少複雑な例 ( has_hoge )!
!
has_hoge<T> の要件!
• 型 T がメンバ関数 hoge() をもっている!
• その返り値が int型である
15
- 19. Tickで遊ぶ
• 実際に型制約を Tick で書き換えてみたよ!
!
ここの point_traits の型制約!
https://gist.github.com/kotoji/af5485cef6e98466328e
18
- 21. Tickで遊ぶ
point_trait<T> の型制約
20
namespace util { namespace detail {
namespace mpl = boost::mpl;
!template <typename Cond, typename Seq, std::size_t I>
struct any_impl {
static constexpr bool value = mpl::apply<Cond,
typename std::tuple_element<I, Seq>::type
>::type::value &&
any_impl<Cond, Seq, I - 1>::value;
};
template <typename Cond, typename Seq>
struct any_impl<Cond, Seq, 0> {
static constexpr bool value = mpl::apply<Cond,
typename std::tuple_element<0, Seq>::type
>::type::value;
};
} // namespace detail
template <typename Cond, typename... Types>
struct any_ : detail::any_impl<Cond, std::tuple<Types...> , sizeof...(Types) - 1> {};
} // namespace util
template <typename T,
typename U = decltype(std::declval<T>().x),
typename U1 = decltype(std::declval<T>().y),
std::enable_if<util::any_<std::is_floating_point<boost::mpl::_1> ,U, U1>::value &&
std::is_default_constructible<T>::value
>::type* = nullptr
>
struct point_traits {
// 実装略
};
- 24. Tickで遊ぶ
Tickで新しくなった point_traits
23
TICK_TRAIT(has_x)
{
template <class T>
auto requires_(T&& p) -> TICK_VALID(
returns<std::is_floating_point<_>>(p.x)
);
};
!
TICK_TRAIT(has_y)
{
template <class T>
auto requires_(T&& p) -> TICK_VALID(
returns<std::is_floating_point<_>>(p.y)
);
};
template <class T,
TICK_REQUIRES(has_x<T>() and has_y<T>() and
std::is_default_constructible<T>::value)
>
struct point_traits {
// 実装略
};