4

magic_getパラメーター パックからインデックスによって値を抽出できる関数を書きたいと思います。次に例を示します。

int n = 0;
n = magic_get<0>(1, 3, 5, 7);
assert(1 == n);
n = magic_get<1>(1, 3, 5, 7);
assert(3 == n);
n = magic_get<2>(1, 3, 5, 7);
assert(5 == n);
n = magic_get<3>(1, 3, 5, 7);
assert(7 == n);

実装方法はmagic_get

4

1 に答える 1

14
template <size_t N, typename... Args>
decltype(auto) magic_get(Args&&... as) noexcept {
    return std::get<N>(std::forward_as_tuple(std::forward<Args>(as)...));
}

C++14 機能が利用できない場合の末尾の戻り値の型を変更decltype(auto)して追加します。autodecltype(/* the whole returned expression here */)


タプルレス版:

template <std::size_t N, typename Tfirst, typename... Args, std::enable_if_t<N == 0, int>...>
decltype(auto) magic_get(Tfirst&& first, Args&&... as) noexcept {
    return std::forward<Tfirst>(first);
}

template <std::size_t N, typename Tfirst, typename... Args, std::enable_if_t<N != 0, int>...>
decltype(auto) magic_get(Tfirst&& first, Args&&... as) noexcept {
    return magic_get<N - 1>(std::forward<Args>(as)...);
}

これは、 clang バグ 11723のおかげで、clang では機能しないことに注意してください。に置き換えるstd::enable_if_t<N != 0, int>...std::enable_if_t<N != 0, int> = 0は簡単な回避策です。

于 2014-07-12T06:48:19.270 に答える