Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/144.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何通过结构的静态数组专门化模板函数 我有点困了,需要C++模板大师的帮助。有一个模板结构: template<typename T, typename ID> struct TypeMapping { T Type; char* Name; ID Id; }; 模板 结构类型映射 { T型; 字符*名称; 身份证; };_C++_Arrays_Templates_Static - Fatal编程技术网

如何通过结构的静态数组专门化模板函数 我有点困了,需要C++模板大师的帮助。有一个模板结构: template<typename T, typename ID> struct TypeMapping { T Type; char* Name; ID Id; }; 模板 结构类型映射 { T型; 字符*名称; 身份证; };

如何通过结构的静态数组专门化模板函数 我有点困了,需要C++模板大师的帮助。有一个模板结构: template<typename T, typename ID> struct TypeMapping { T Type; char* Name; ID Id; }; 模板 结构类型映射 { T型; 字符*名称; 身份证; };,c++,arrays,templates,static,C++,Arrays,Templates,Static,还有一些模板函数如下所示: 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

还有一些模板函数如下所示:

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;
}
模板
bool TryGetTypeByNameImp(常量类型映射映射[],大小映射大小,
常量字符*名称、T和类型)
{
对于(大小i=0;i
Map(第一个参数)定义为(有几个类似的Map)

名称空间音频
{ 
常量类型映射映射[]=
{
{AAC,“AAC”,AMF_CODEC_AAC},
{MP3,“MP3”,AMF_编解码器{U MP3},
{PCM,“PCM”,AMF_编解码器_PCM_公式}
};
const size_t MapSize=sizeof(Map)/sizeof(Map[0]);
}
Map作为参数传递给函数,我正在寻找如何将其作为模板参数传递,以便可以使用以下示例中的函数:

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

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

您当然可以使用数组本身(以及指向它的指针)作为模板参数:

#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>();
}
#包括
模板结构S{T;};
S[]={21},{22};
模板void f(){std::cout
也就是说,我对您的代码有三点看法:

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

    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::pair TryGetTypeByNameImp(
    常量类型映射映射[],大小映射大小,
    常量字符*名称)
    {
    对于(大小i=0;i

啊,我也会考虑使用“代码> STD::Vector 或 STD::数组这里代替C数组。那么,您不必手动地使用数组中的所有函数来左右数组大小。

无论如何,您不能使用Struts作为模板参数。谢谢您的评论。我将解释为什么我试图查看。此方向:抱歉,我按Enter键太快。我将在这里继续。谢谢您的评论。我将解释为什么我尝试朝此方向看。(0)audio::Map不是一个变量-它是一个常量。编译器知道它的大小,我想(希望)它可以用作模板参数。关于你的第一句话-我理解你的意思,这就是我试图从函数参数中删除它的原因。关于第二句话-你建议在类型映射中使用const char*Name吗?第三句话-我可能会使用你的建议(实际上我只是从C#复制了TryGet逻辑)@奥列格的反顺序:<代码> TyGue*//Cuff>和 TyPARSE */COM>在C语言中是一个设计错误。不幸的是,C版本的第一个版本没有表达这个概念的好概念,但是C++确实如此。事实上,标准库已经使用了这个。第二,是的,使用代码> char const */CODE >。没有<代码> const <代码>它将无法编译。在C++11中,在C++03中,在
pedantic
模式中,两者都不可用。第三,您只能将整型常量(和指向函数的指针)用作模板参数,而不能将其用作模板类型参数。因此,在您的情况下,这将不起作用。
#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>();
}
bool r = TryGetTypeByNameImp<audio::Map>("aac", type);
bool r = TryGetTypeByNameImp(audio::Map, "aac", type);
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());
}