背景
std::vector
ということがわかっている変数から, 型 T を抽出したい.
方法
std::vector<float> a;
using t = decltype(*a.begin());
static_assert(std::is_same<t, float>::value == true, "type must be float");
*a.data()
でもいいかもしれません.
a[0]
でも OK でした.
配列のインデックスを取るのは, カラの配列時 seg fault しそうでちょっと抵抗がありますが, sizeof はコンパイル時の処理だからか, 実のところカラの配列に対して行っても実行時問題ありませんでした(asan でも問題なかった)
おまけ
std::vector<float *>
など, ポインタの可能性のあるときからポインタ除去した型がほしい.
std::remove_pointer
を使います.
ポインタで無い場合はなにもしないので汎用に使えます.
ただ, この場合 std::decay
と組み合わせないとうまくいかないです.
decayメタ関数
https://faithandbrave.hateblo.jp/entry/20120416/1334563367
C++ Get Vector type
https://stackoverflow.com/questions/12490508/c-get-vector-type/53259979#53259979
こんな感じになります.
std::vector<float *> b;
using t = std::remove_pointer<std::decay<decltype(*b.begin())>::type>::type;
// => t = `float`
この場合, std::vector<float[2]> b
なケースでも float
が型として取得できます!