1

0 から特定のインデックスまでのパラメーター パックのサブセットに含まれるバイト数を特定できるようにしたいと考えています。

現在、これを行うには constexpr 以外の方法を使用しています。以下は私のコードです:

template <size_t index, typename... args> struct pack_size_index;

template <size_t index, typename type_t, typename... args>
struct pack_size_index <index, type_t, args...> {
    static const size_t index_v = index;

    static const size_t value(void) {
        if (index_v > 0) {
            return sizeof(type_t) + pack_size_index<index - 1, args...>::value();
        }

        return 0;
    }
};

template <size_t index> struct pack_size_index <index> {
    static const size_t index_v = index;

    static const size_t value(void) { return 0; }
};

使用法:

//output: 5  (equal to 1 + 4)
std::cout << pack_size_index<2, bool, float, int, double>::value() << std::endl;

//output: 20 (equal to 8 + 8 + 4)
std::cout << pack_size_index<3, double, double, float, int>::value() << std::endl;

これで作業は完了しますが、これは実行時比較を使用するため、これを使用するたびに結果の実行可能ファイルのサイズが急速に増加します。これを行うためのより安価な方法は何ですか?

4

1 に答える 1

3

Solved, I think:

template <size_t index, typename... args> struct pack_size_index;

template <size_t index, typename type_t, typename... args>
struct pack_size_index <index, type_t, args...> {
    static const size_t value = (index > 0)?
        (sizeof(type_t) + pack_size_index<index - 1, args...>::value):0;
};

template <size_t index> struct pack_size_index <index> {
    static const size_t value = 0;
};
于 2013-11-04T04:35:48.033 に答える