- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个要求,其中有一个枚举,并且为所有可能的枚举组合定义了模板函数,最大长度为 l。
假设枚举是
Enum typenum {A, B, C}
所有这些模板函数都是在运行时定义和可用的(即,编译器在编译时创建这些函数)
Alpha<A>::f()
Alpha<B>::f()
Alpha<C>::f()
Alpha<A,A>::f()
Alpha<A,B>::f()
Alpha<A,C>::f()
Alpha<B,A>::f()
Alpha<B,B>::f()
Alpha<B,C>::f()
Alpha<C,A>::f()
Alpha<C,B>::f()
Alpha<C,C>::f()
and combination of 3 enums, 4 enums...
现在我必须根据输入 vector 选择正确的函数
void f(vector<enum> eVec){
Alpha::f<eVec[0], eVec[1],... eVec[eVec.size() - 1]>() // <-------
我该怎么做?一种方法是为每个尺寸定义。例如:
if(eVec.size() == 1)
Alpha<eVec[0]>::f()
else if(eVec.size() == 2)
Alpha<eVec[0], eVec[1]>::f()
虽然这不会扩展。是否有任何优雅、可扩展的方式来执行此操作。
最佳答案
And all these template functions are defined and available at runtime (i.e, compiler creates these functions at the compile time)
你确定这是个好主意吗?因为,如果你想选择运行时模板值,你必须执行,编译时,所有可能的Alpha<typeNumsValues...>::f()
组合。如果您不对可变参数列表施加长度限制,那是不可能的,但是当限制相对较低时,计算成本也非常高。
无论如何......假设你有一个枚举如下
enum typeEnum { A, B, C };
和可变参数模板 Alpha
类,有typeEnum
模板值和 static
方法 f()
如下
template <typeEnum ...>
struct Alpha
{ static void f () { /* do something */ } };
你的f()
可以调用可变参数 f_helper()
void f (std::vector<typeEnum> const & eVec)
{ f_helper<>(eVec, 0u); }
实现如下
template <typeEnum ...>
void f_helper (std::vector<typeEnum> const &, ...)
{ }
template <typeEnum ... Tes>
typename std::enable_if<(sizeof...(Tes) < 6u)>::type
f_helper (std::vector<typeEnum> const & eVec, std::size_t index)
{
if ( index < eVec.size() )
switch ( eVec[index++] )
{
case A: f_helper<Tes..., A>(eVec, index); break;
case B: f_helper<Tes..., B>(eVec, index); break;
case C: f_helper<Tes..., C>(eVec, index); break;
}
else
Alpha<Tes...>::f();
}
请注意,我对可变参数列表的长度设置了一个非常低的限制(5,sizeof...(Tes) < 6u
),因为开发的数量 Alpha
呈指数级增长。
另请注意,我添加了一个不执行任何操作的 f_helper()
版本;这是必要的,因为长度小于 6 的递归调用 f_helper()
,可以使用必须以某种方式管理的 6 个枚举的可变列表来调用它。
下面是一个完整的编译示例
#include <vector>
enum typeEnum { A, B, C };
template <typeEnum ...>
struct Alpha
{ static void f () { } };
template <typeEnum ...>
void f_helper (std::vector<typeEnum> const &, ...)
{ }
template <typeEnum ... Tes>
typename std::enable_if<(sizeof...(Tes) < 6u)>::type
f_helper (std::vector<typeEnum> const & eVec, std::size_t index)
{
if ( index < eVec.size() )
switch ( eVec[index++] )
{
case A: f_helper<Tes..., A>(eVec, index); break;
case B: f_helper<Tes..., B>(eVec, index); break;
case C: f_helper<Tes..., C>(eVec, index); break;
}
else
Alpha<Tes...>::f();
}
void f (std::vector<typeEnum> const & eVec)
{ f_helper<>(eVec, 0u); }
int main ()
{
f({A, B, C, A});
}
关于C++ : How to programmatically define template types in runtime?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53109401/
我的问题分为两部分 1) 我想将文件名分配给 FileUpload 控件然后保存它,但问题是它是只读的 FileUpload1.FileName="ClientMachine\\Ima
我目前正在开发一个适用于 iOS 和 macOS 的跨平台应用程序,使您的 iOS 设备可以用作触控板。 使用CGDisplayMoveCursorToPoint,我可以在屏幕上移动光标。奇迹般有效。
要为其他应用程序提供 API,我们可以使用 android:exported="true" 导出我们自己的内容提供程序、服务和广播接收器在我们的应用程序中的 AndroidManifest.xml .
我正在构建一个同义词库应用程序,对于这个问题,关键是我正在为特定单词(例如 - “feline”、“tomcat”)添加同义词列表(具有相同含义的单词) "、"puss"是 "cat"的同义词) 我有
我正在创建音频,为它分配源并使用jquery以编程方式将其附加到页面,我还需要向该音频添加一个类,但是我无法使其工作,我尝试了以下操作: var song = new Audio(); song.sr
我想以编程方式使用 RadioButton 的属性 - android:button="@drawable/abc"。 我如何用 Java 编写这个? 最佳答案 试试这个 radioButton.se
什么是 QTP 中的描述性编程? 最佳答案 在不使用对象存储库的情况下创建测试称为描述性编程,因为您将对象描述为脚本的一部分。 例如 Browser("title:=Google").Page("ti
这个问题在这里已经有了答案: Android Activity, how to override manifest's android:configChanges with Java code? (2
我正在尝试将二进制数据存储在动态创建的 JCR 中。我的问题是 JCR API 提供的唯一方法是通过 InputStream : Session session = request.getResour
这个问题在这里已经有了答案: Set EditText Digits Programmatically (6 个回答) 2年前关闭。 我目前正在使用 android:digits="qwertzuio
我正在开发 Windows 窗体应用程序。我有以下问题:在一个表单中有一个面板,在那个面板中我有许多控件(只是一个带有文本框的标签,数量是在运行时确定的)。此面板的大小小于动态添加的所有控件的总和。所
在国际象棋小程序的框架内,我有几套这样的灰度/黑白(不确定): 有什么方法可以通过 Java 代码为 PNG 图片赋予色调?尝试用谷歌搜索此事,但没有找到任何真正符合我正在寻找的东西。 例如,对于下面
我有一个 CompilationUnit,其中包含一个未导入对另一个类的引用的类。Eclipse 轻松解决了此类问题,并建议导入缺少的类(位于父包中)。 如何在不知道其名称或位置的情况下以编程方式导入
我可以完全访问 Android 系统。我拥有所有 super 用户权限,可以从我的任何应用程序中执行所有操作。我只想实现一项功能,其中我需要重置设备而不将用户重定向到 PRIVACY_SETTINGS
Android Q 引入了一项设置,可以在应用程序上强制使用深色模式,而无需担心手动更改颜色:https://developer.android.com/preview/features/darkth
好的,所以我做了一些研究,似乎一致认为您不能以编程方式更新 android:updatePeriodMillis。 看来您必须改用 AlarmManager,这就像使用大锤来敲开坚果一样……奇怪的是
我正在努力在我的表格 View 中实现一些自定义操作。目前我在下面的代码中创建了一个自定义操作。 override func tableView(tableView: UITableView, edi
我有这个委托(delegate),它打算在用户用手指滚动时执行: -(void)scrollViewDidScroll:(UIScrollView *)scrollView 我有一行代码滚动到开头:
如果我们有这段代码: int a; cout > a; 在终端中,输入请求看起来像这样 please enter a value: _ 我如何以编程方式模拟用户在其中的输入。 最佳答案 下面是一个示例
是否可以通过 java 方法以编程方式重新呈现 a4j:outputPanel? 最佳答案 您可以保留民意调查,并在方法中设置一些标志(如果该标志已在民意调查中捕获),因为设置只是渲染面板 关于jav
我是一名优秀的程序员,十分优秀!