忍者ブログ

どっかのゆとりのチラシの裏

plasma_effectのメモ帳的ブログのようなsomething

[PR]

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

func_switch

なんか知らんけど夕方からずっとswitch構文のラッパー関数を作ってた。
複数の関数オブジェクトと引数のtupleとsize_t 変数を引数に渡しsize_t 変数の値によって関数オブジェクトを実行しその返り値を返すっていう関数である。
switch文で書くより見栄えが良くなるとか思いながら作ってたわけである。
とりあえずその実装コードと使用例どうぞ。
#include<type_traits>
#include<tuple>
#include<iostream>

//index_tuple
template<size_t... Num>struct index_tuple{};
template<size_t Max, size_t... Nums>struct index_count:index_count<Max - 1, Max, Nums...>{};
template<size_t... Nums>struct index_count<0, Nums...>
{
using type = index_tuple<0, Nums...>;
};

//type_num
template<class Type, class... Types>struct type_num
{
static const int value = 1 + type_num<Types...>::value;
};
template<class Type>struct type_num<Type>
{
static const int value = 1;
};

//tuple_num
template<class Ty>struct tuple_num;
template<class... Types>struct tuple_num<std::tuple<Types...>>
{
static const int value = type_num<Types...>::value;
};

//func_tuple
template<class RetType, class ArgTupleTy, class FuncTy, class ArgTy>struct func_tuple_impl;
template<class RetType, class ArgTupleTy, class FuncTy, size_t... Nums>
struct func_tuple_impl<RetType, ArgTupleTy, FuncTy, index_tuple<Nums...>>
{
static RetType run(ArgTupleTy tup, FuncTy func)
{
return func(std::get<Nums>(tup)...);
}
};
template<class RetType, class ArgTupleTy, class FuncTy>
using func_tuple = func_tuple_impl<RetType, ArgTupleTy, FuncTy,
typename index_count<tuple_num<ArgTupleTy>::value - 1>::type>;

//func_switch
template<class RetType, class ArgTupleTy, class FuncTy, class... FuncTypes>
struct func_switch_impl
{
static RetType run(size_t switch_on, ArgTupleTy tup, FuncTy func, FuncTypes... funcs)
{
return (switch_on == 0 ?
func_tuple<RetType, ArgTupleTy, FuncTy>::run(tup, func)
: func_switch_impl<RetType, ArgTupleTy, FuncTypes...>
::run(switch_on - 1, tup, funcs...));
}
};
template<class RetType, class ArgTupleTy, class FuncTy>
struct func_switch_impl<RetType, ArgTupleTy, FuncTy>
{
static RetType run(size_t, ArgTupleTy tup, FuncTy func)
{
return func_tuple<RetType, ArgTupleTy, FuncTy>::run(tup, func);
}
};
template<class RetType, class ArgTupleTy, class... FuncTypes>
inline RetType func_switch(size_t switch_on, ArgTupleTy tup, FuncTypes... funcs)
{
return func_switch_impl<RetType, ArgTupleTy, FuncTypes...>::run(switch_on, tup, funcs...);
}

//example
auto x = [](int, int, int)->int{return 0; };
auto y = [](int a, int b, int c)->int{return a + b + c; };
auto z = [](int, int, int)->int{return 1; };

int main()
{
auto w = func_switch<int>(1, std::tuple<int, int, int>(1, 2, 3), x, y, z);
std::cout << w << std::endl;
std::cin.get();
}




なげーよクソボケって話なのだが。
とりあえずこれでswitch構文のラッパーみたいなのが出来た。
PR

constexpr初級問題?

C++11になってconstexprという機能が搭載された。
簡単に説明すると変数に対して使えばコンパイル時定数じゃないとコンパイルエラーになるconst定数に、関数に対して使えば定数式となる関数にしてくれる機能である。
リテラル型云々については中3女子氏のブログなどで参照して欲しい。今回は上の2つだけでなんとかなる内容である。

さて、もうそろそろC++14が来る(ていうかclangはC++14を完全搭載してる)がC++11時代のconstexprもパズル的で楽しい。というわけでconstexpr初心者の私がconstexpr初心者向けに問題を3つ考えることにした。
以下の3問である。

以下の処理をするconstexpr関数をそれぞれ作れ。
(1)2以上100000以下の整数nに対してn以下の素数の総和を求める関数size_t prime_sum(int n)
(2)0x1以上0x10000未満の整数Numとdouble型配列real[Num]に対してその最大値を求めるtemplate<size_t Num>double max(double(&real)[Num])
(3)各成分がdouble型である3次元ベクトル(x,y,z)と(a,b,c)についてその角度θについての余弦cosθを求めるdouble cos(double x,double y,double z,double a,double b,double c)

(3)だけ簡単過ぎる気がするけどキニシナイキニシナイ。

C++入門を書こうとしているが

今の時代C++の入門のサイトがどれもこれも時代遅れになってる感が凄い。
てなわけで入門をこのブログでやろうとか考えてるわけ。
で、だ。その内容を今考えてるわけよ。入門は順番が大事だからな。
今考えてるのは以下の順番。
・環境導入と標準出力(cout)と' ; '区切りで処理されること
・変数宣言(string含む)と代入と基本演算と標準入力
・ifとforとwhileと配列
・関数宣言とグローバル変数とnamespace
・クラスの定義とアクセス指定と使用
・コンストラクタとデストラクタ
・static
・継承とprotected
・関数のオーバーロードとtemplate
・メンバ関数のオーバーライドと演算子オーバーロード
・const
・プリプロセッサ
・typedefとusingエイリアス
・リンケージ(externとstatic)
・ポインタと参照
・動的確保(malloc&free→new&delete→unique_ptr&shared_ptr)
・可変長テンプレートとmake_unique/make_shared
・代表的な標準ライブラリの紹介
環境はMSVS2013を予定している。インテリセンスとかシンタックスハイライトとかあるし。
VC++はC++じゃないという人はいる。が、根底は同じなのでVC++を使う。

最後のはcmathとかrandomとかSTLとか言い出したらきりないし面倒なので云々。

カレンダー

04 2024/05 06
S M T W T F S
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31

フリーエリア

最新CM

[02/12 kariya_mitsuru]
[10/14 どっかの京大生o]
[10/04 どっかのZ会生y]
[07/31 どっかのZ会生y]
[07/31 GNR]

プロフィール

HN:
plasma_effect
性別:
非公開

バーコード

ブログ内検索

最古記事

(06/08)
(06/18)
(06/21)

P R