gpt4 book ai didi

c++ - 如何通过静态结构数组专门化模板函数

转载 作者:太空狗 更新时间:2023-10-29 21:26:23 28 4
gpt4 key购买 nike

我有点卡住了,需要 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;
}

Map(第一个参数)定义为(有几个类似的map)

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]);
}

Map 作为参数传递给一个函数,我正在寻找如何将它作为模板参数传递,以便我可以使用此示例中的函数:

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

我发现的唯一解决方案是定义一个包含静态 Map 和 MapSize 的结构,并将该结构用作模板参数,但我不喜欢这个解决方案,我正在寻找另一个。有人知道怎么做吗?

最佳答案

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

这试图将 audio::Map 用作类型——但它不是,它是一个变量。只需将它作为普通参数传递给函数:

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

也就是说,我对您的代码有三点意见:

  • 请注意,将函数参数声明为数组 (x[]) 实际上会将其声明为指针。您的代码正确使用了它,但使用数组语法会产生误导。请改用指针。
  • 这段代码对我来说有点太重 C 了。虽然我同意在这里使用原始 C 字符串是合适的,但您对 char* 的使用在 C++11 中是非法的,并且在 C++03 中已弃用(因为您指向的是字符串文字)。使用 char const*。此外,我建议在函数中使用 std::string 参数,并使用比较运算符 == 而不是 strcmp
  • 您正在使用输出参数,type。我讨厌这种技术。如果你想返回一个值,使用返回类型。由于您还返回一个成功值,因此请使用 pair 作为返回类型,除非有非常令人信服的理由不这样做:

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

    return std::make_pair(false, T());
    }

啊,我还考虑在这里使用 std::vectorstd::array 而不是 C 数组。这样您就不需要在所有使用该数组的函数中手动调整数组大小。

关于c++ - 如何通过静态结构数组专门化模板函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11781472/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com