当前位置: 首页 > 知识库问答 >
问题:

使用非类型变量模板进行运行时计算

柳英资
2023-03-14

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

想象一下以下情况:

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方法应该返回给定整数在模板参数包中的位置。如果参数包中不存在给定的整数,则应生成错误(最好是在编译时)。

另外,我知道如果签名改为

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

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

共有1个答案

赵佐
2023-03-14

您可以将索引转储到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

 类似资料:
  • 变量通用属性 变量通用属性有title,value,type,tip,rule,message,除了通用属性个别变量还有其它属性,请看每个具体控件; "vars": { "varName1": { "title": "测试 text", /*后台设置时 input 的 label*/ "value": "1", /*变量默认值*/ "type

  • 变量通用属性 变量通用属性有title,value,type,tip,rule,message,除了通用属性个别变量还有其它属性,请看每个具体控件; "vars": { "varName1": { "title": "测试 text", /*后台设置时 input 的 label*/ "value": "1", /*变量默认值*/ "type

  • 问题内容: Java中有没有办法反映局部变量的通用类型?我知道您可以通过一个字段来解决这个问题- 获取泛型类型的java.util.List。任何想法如何解决,例如: 或更笼统: 问题答案: 这是一个很好的教程,显示了如何以及何时可以使用反射读取泛型。例如从firs 方法获取String 您可以使用此代码 输出: parameterArgClass =类java.lang.String 可能是因为

  • 我在android和Kotlin有奇怪的问题。问题是我用类型定义变量,但在运行时更改为 我这样定义我的变量: 我使用kotlin 1.3.71和jvm 1.8。 更新0:

  • 我试图在类型s. t上专门化一个类。它忽略了给定类型的恒定性。在这种情况下,该类型是一个模板模板参数: 上面的代码在GCC 4.8.4和clang 5.0(with-std=c 11)中都抱怨bar在与匹配FOFType模板参数化的类一起使用时未定义。即使我删除了sfinae参数,仍然无法找到特化。 这个问题的一个例子可以在这里找到:https://godbolt.org/g/Cjci9C.在上面

  • 问题内容: 我想知道在Java中专门化泛型类型的选项是什么,即在模板化类中具有对某些类型的特定替代的选项。 在我的情况下,我是一个泛型类(类型T),通常返回null,但是当T为String类型时返回“”(空字符串),而当其Integer类型时返回0(零),等等。 仅提供方法的特定于类型的重载会产生“方法不明确”错误: 例如: 是用特定类型将泛型类子类化的唯一选择(请参见以下示例中的StringBa