使用非类型可变参数模板的运行时计算

时间:2016-01-08 09:09:46

标签: c++ variadic-templates

是否可以使用非类型可变参数模板进行运行时计算?

想象一下以下情况:

template<unsigned int... indexes>
struct s
{
   unsigned int getPosition(const unsigned int target) const;
};

s<2,5,0,7> obj;
std::cout << obj.getPosition(5) << std::endl; //< this should output 1
std::cout << obj.getPosition(2) << std::endl; //< this should output 0

getPosition方法应返回模板参数包中给定整数的位置。如果参数包中不存在给定的整数,则应生成错误(最好在编译时)。

P.S。如果签名更改为

,我知道如何执行此操作
template<unsigned int... indexes>
struct s
{
   template<unsigned int target>
   unsigned int getPosition() const;
};

不幸的是,这不是我的选择,因为该方法应该是虚拟的。

1 个答案:

答案 0 :(得分:4)

您可以将索引转储到std::array并使用std::find

struct s
{
   unsigned int getPosition(const unsigned int target) const {
       static std::array<int, sizeof...(indexes)> indexArray { indexes... };
       auto pos = std::find(std::begin(indexArray), std::end(indexArray), target);

       if (pos == std::end(indexArray)) {
           //handle error, probably an exception   
       }

       return std::distance(std::begin(indexArray), pos);
   }
};

如果target不存在,则无法生成编译时错误,因为您在运行时只知道target