3

私は少し行き詰まっていて、C++テンプレートの第一人者の助けが必要です。テンプレート構造体があります:

template<typename T, typename ID>
struct TypeMapping
{
    T Type;
    char* Name;
    ID Id;
};

そして、このようないくつかのテンプレート関数:

template<typename T, typename ID>
bool TryGetTypeByNameImp(const TypeMapping<T, ID> map[], size_t mapSize,
    const char* name, T& type)
{
    for (size_t i = 0; i < mapSize; i++)
    {
        if (strcmp(map[i].Name, name) == 0)
        {
            type = map[i].Type;
            return true;
        }
    }

    return false;
}

マップ(最初のパラメーター)は次のように定義されます(同様のマップがいくつかあります)

namespace audio
{ 
    const TypeMapping<Type, AMF_CODEC_ID> Map[] = 
    {
        {AAC, "aac", AMF_CODEC_AAC},
        {MP3, "mp3", AMF_CODEC_MP3},
        {PCM, "pcm", AMF_CODEC_PCM_MULAW}
    };

    const size_t MapSize =  sizeof(Map)/sizeof(Map[0]);
}

マップは引数として関数に渡され、次のサンプルのような関数を使用できるように、テンプレートパラメーターとしてマップを渡す方法を探しています。

 audio::Type type;
 bool r = TryGetTypeByNameImp<audio::Map>("aac", type);

私が見つけた唯一の解決策は、静的なMapとMapSizeを保持する構造体を定義し、その構造体をテンプレートパラメーターとして使用することですが、この解決策は好きではなく、別の解決策を探しています。誰かがこれを行う方法を知っていますか?

4

2 に答える 2

1

配列自体 (つまり、配列へのポインター) をテンプレート パラメーターとして使用できます。

#include <iostream>
template<typename T> struct S { T t; };
S<int> s[] = { { 21 }, { 22 } };
template<typename T, size_t n, S<T> (*m)[n]> void f() { std::cout << (*m)[n - 1].t; }
int main() {
    f<int, 2, &s>();
}

ここでの問題は、配列の長さとその型に対してテンプレート引数推定を使用できないため、配列自体に加えて両方をテンプレート パラメーターとして指定する必要があることです。構造体を渡すか、ベクトルを渡すことがより良い解決策になると本当に思います.

#include <vector>
#include <iostream>
template<typename T> struct S { T t; };
std::vector<S<int>> s{ { 21 }, { 22 } };
template<typename T, std::vector<S<T>> *v> void f() { std::cout << v->back().t; }
int main() {
    f<int, &s>();
}
于 2012-08-03T10:04:46.407 に答える