C++ C++;使用模板为特定枚举值创建方法

C++ C++;使用模板为特定枚举值创建方法,c++,templates,enums,C++,Templates,Enums,我想写一个方法,让编译器根据特定的枚举值生成多个方法 下面我有一些isValid*()方法。它们都具有与您所看到的相同的结构,因此我想将它们合并到一个方法中。也许模板对此有用?也许不是 类似于以下伪代码(为清晰起见进行了编辑): 是否有一种编译时方法可以将这些方法组合成一个方法,以保持性能,并且不会牺牲太多的代码清晰度。模板选择发生在传递给模板函数/用户定义类型的类型之上,并且不依赖于诸如enum之类的值 如果您只想切换Enum,则不需要模板,代码如下: #include<iostream

我想写一个方法,让编译器根据特定的枚举值生成多个方法

下面我有一些isValid*()方法。它们都具有与您所看到的相同的结构,因此我想将它们合并到一个方法中。也许模板对此有用?也许不是

类似于以下伪代码(为清晰起见进行了编辑):


是否有一种编译时方法可以将这些方法组合成一个方法,以保持性能,并且不会牺牲太多的代码清晰度。

模板选择发生在传递给模板函数/用户定义类型的类型之上,并且不依赖于诸如enum之类的值

如果您只想切换Enum,则不需要模板,代码如下:

#include<iostream> 
enum Dir { East, West };


void doStuff()
{
    std::cout<<"doStuff"<<std::endl;
}
// This method should be resolved at compile time
void  opposite()
{
   std::cout<<"Opposite"<<std::endl;
}



void  isValid(const Dir dir)
{
  switch (dir)
  {
    case East:
       doStuff();
    case West:
        opposite();

  }
}
int main()
{
    isValid(East);
    return 0;
}
#包括
enum Dir{东、西};
void doStuff()
{

std::cout模板在这种情况下很有用,下面的代码可能满足您的要求

为了简化,有必要手动将
enum Dir
的值更改为一些特殊值(两个相反方向的总和为零)

enum Dir{East=-2,West=2,South=-1,North=1};
布尔福(警察局长)
{
//做点什么
返回false;
}
模板
结构CalDir
{
静态布尔值有效(常量目录)
{
交换机(dir)
{
案例n:返回foo(dir);
案例0-n:返回true;
默认:返回false;
}
}
};
int main()
{
dira=东;
CalDir::isValid(a);//与isValidFromWest(a)的等价物
Dir b=北;
CalDir::isValid(b);//与isValidFromSouth(b)的等价物
返回0;
}

也许您应该查看查找表和函数对象(或
std::map
和函数对象)。我认为您不了解模板是如何工作的。它们不使用特定的值,而是使用特定的类型。另外,
对立面(TDIR)有什么作用
,您不能将类型的名称传递给函数,就像调用
doSomething(int)一样
@HSchmale有一种非类型模板参数。你确实可以在整数值上模板,而不仅仅是类型。@T.C.我觉得这是一种不好的做法。这只是一种使用模板的非标准方式,或者至少是一种我以前没有见过的方式。现在,海报已经澄清了这一点,它变得更有意义了。
#include<iostream> 
enum Dir { East, West };


void doStuff()
{
    std::cout<<"doStuff"<<std::endl;
}
// This method should be resolved at compile time
void  opposite()
{
   std::cout<<"Opposite"<<std::endl;
}



void  isValid(const Dir dir)
{
  switch (dir)
  {
    case East:
       doStuff();
    case West:
        opposite();

  }
}
int main()
{
    isValid(East);
    return 0;
}
enum Dir{East = -2, West = 2, South = -1, North = 1};

bool foo(const Dir dir)
{
    //Do something
    return false;
}

template< Dir n >
struct CalDir
{
    static bool isValid(const Dir dir)
    {
        switch (dir)
        {
        case n:     return foo(dir);
        case 0 - n: return true;
        default:    return false;
        }
    }
};

int main()
{
    Dir a = East;
    CalDir<East>::isValid(a); //Equivalents to isValidFromWest(a)
    Dir b = North;
    CalDir<South>::isValid(b);//equivalents to isValidFromSouth(b)

    return 0;
}