3

http://sourceforge.net/projects/dtmf/で DTMF コードを勉強しています。理解に苦しんでいるいくつかの C++ コードに出くわしました。

template<int, int, int, int> class Types;
template <> class Types<5, 4, 2, 1>
{
public:
        typedef long int Int40;
        typedef unsigned long int Uint40;
        typedef int Int32;
        typedef unsigned int Uint32;
        typedef short int Int16;
        typedef unsigned short int Uint16;
        typedef char Int8;
        typedef unsigned char Uint8;
};
template <> class Types<8, 4, 2, 1>
{
public:
        typedef long int Int64;
        typedef unsigned long int Uint64;
        typedef int Int32;
        typedef unsigned int Uint32;
        typedef short int Int16;
        typedef unsigned short int Uint16;
        typedef char Int8;
        typedef unsigned char Uint8;
};
template <> class Types<4, 4, 2, 1>
{
public:
        typedef int Int32;
        typedef unsigned int Uint32;
        typedef short int Int16;
        typedef unsigned short int Uint16;
        typedef char Int8;
        typedef unsigned char Uint8;
};

// For 16bit chars
template <> class Types<2, 1, 1, 1>
{
public:
        typedef long int Int32;
        typedef unsigned long int Uint32;
        typedef short int Int16;
        typedef unsigned short int Uint16;
};

typedef Types<sizeof(long int), sizeof(int), sizeof(short int), sizeof(char)>::Int32     INT32;
typedef Types<sizeof(long int), sizeof(int), sizeof(short int), sizeof(char)>::Uint32    UINT32;
typedef Types<sizeof(long int), sizeof(int), sizeof(short int), sizeof(char)>::Int16     INT16;
typedef Types<sizeof(long int), sizeof(int), sizeof(short int), sizeof(char)>::Uint16    UINT16;

そこから、通常のプリミティブ型と同じように使用されます。

static const INT16 tempCoeff[8];

私の直感では、これらすべてがある種のクロスプラットフォームの移植性を実現していると言っています。私は正しいですか、それとももっとありますか?

4

3 に答える 3

5

stdint.hへの呼び出しに基づいて、特定のサイズの整数型にある程度移植可能なメカニズムを提供することにより、彼らは再発明しているようです(MSコンパイラの一部/多くのバージョンではサポートされていないと思います) sizeof。受け入れる 4 番目のテンプレート パラメータは常に 1 であるsizeof(char)ため、まったく役に立たないことに注意してください。sizeof(char)

于 2012-10-12T16:59:29.200 に答える
2

もう少し健全なアプローチを考案できるかどうか見てみましょう (CHAR_BITプラットフォームに対して正しく定義されている必要があります)。

namespace portable_inttypes
{
    template<typename Tchain, typename T, typename Tun, size_t Tsize = sizeof (T) * CHAR_BIT, bool atleast64 = Tsize >= 64>
    struct autodef_helper64 : Tchain {};

    template<typename Tchain, typename T, typename Tun, size_t Tsize>
    struct autodef_helper64<Tchain, T, Tun, Tsize, true> : Tchain
    {
        typedef T int_least64_t;
        typedef Tun uint_least64_t;
    };

    template<typename Tchain, typename T, typename Tun>
    struct autodef_helper64<Tchain, T, Tun, 64, true> : Tchain
    {
        typedef T int64_t, int_least64_t;
        typedef Tun uint64_t, uint_least64_t;
    };

    template<typename Tchain, typename T, typename Tun, size_t Tsize = sizeof (T) * CHAR_BIT, bool atleast32 = Tsize >= 32>
    struct autodef_helper32 : autodef_helper64<Tchain, T, Tun> {};

    template<typename Tchain, typename T, typename Tun, size_t Tsize>
    struct autodef_helper32<Tchain, T, Tun, Tsize, true> : autodef_helper64<Tchain, T, Tun>
    {
        typedef T int_least32_t;
        typedef Tun uint_least32_t;
    };

    template<typename Tchain, typename T, typename Tun>
    struct autodef_helper32<Tchain, T, Tun, 32, true> : autodef_helper64<Tchain, T, Tun>
    {
        typedef T int32_t, int_least32_t;
        typedef Tun uint32_t, uint_least32_t;
    };

    template<typename Tchain, typename T, typename Tun, size_t Tsize = sizeof (T) * CHAR_BIT, bool atleast32 = Tsize >= 16>
    struct autodef_helper16 : autodef_helper32<Tchain, T, Tun> {};

    template<typename Tchain, typename T, typename Tun, size_t Tsize>
    struct autodef_helper16<Tchain, T, Tun, Tsize, true> : autodef_helper32<Tchain, T, Tun>
    {
        typedef T int_least16_t;
        typedef Tun uint_least16_t;
    };

    template<typename Tchain, typename T, typename Tun>
    struct autodef_helper16<Tchain, T, Tun, 16, true> : autodef_helper32<Tchain, T, Tun>
    {
        typedef T int16_t, int_least16_t;
        typedef Tun uint16_t, uint_least16_t;
    };

    template<typename Tchain, typename T, typename Tun, size_t Tsize = sizeof (T) * CHAR_BIT, bool atleast8 = Tsize >= 8>
    struct autodef_helper8 : autodef_helper16<Tchain, T, Tun> {};

    template<typename Tchain, typename T, typename Tun, size_t Tsize>
    struct autodef_helper8<Tchain, T, Tun, Tsize, true> : autodef_helper16<Tchain, T, Tun>
    {
        typedef T int_least8_t;
        typedef Tun uint_least8_t;
    };

    template<typename Tchain, typename T, typename Tun>
    struct autodef_helper8<Tchain, T, Tun, 8, true> : autodef_helper16<Tchain, T, Tun>
    {
        typedef T int8_t, int_least8_t;
        typedef Tun uint8_t, uint_least8_t;
    };

    struct autodef_base {};
    typedef autodef_helper8<autodef_base, long long, unsigned long long> autodef_longlong;
    typedef autodef_helper8<autodef_longlong, long, unsigned long> autodef_long;
    typedef autodef_helper8<autodef_long, int, unsigned> autodef_int;
    typedef autodef_helper8<autodef_int, short, unsigned short> autodef_short;
    typedef autodef_helper8<autodef_short, signed char, unsigned char> autodef_char;
}

typedef portable_inttypes::autodef_char inttypes;

int main(void)
{
    return sizeof(inttypes::uint32_t);
}
于 2012-10-12T17:54:10.873 に答える
1

このコードは、さまざまな基本スカラータイプのサイズを計算し、それに応じていくつかのタイプを定義します。

そうです、クロスプラットフォームの互換性のために使用されます。しかし、なぜそれがそのように使用されるのかは私の理解を超えています。

于 2012-10-12T16:57:34.030 に答える