c++ - 来自变量的模板类型
问题描述
对于 Unity (C#) 和 C++ 插件之间的接口,我需要能够使用 Unity 中定义的两个模板参数来实例化一个类。我不能直接传递 C++ 类型,所以我使用的是char
andswitch
语句。
对于单个参数,它看起来像这样:
char type = 'I'; // For example; in practice, it is set from a Unity plugin call)
switch (type)
{
case 'I':
{
ExtArrayExporter<int> * data_link = new ExtArrayExporter<int>(static_cast<int*>(external_array), ext_array_length);
return(EXT_TYPES::RegisterNew(data_link));
}
case 'F':
{
ExtArrayExporter<float> * data_link = new ExtArrayExporter<float>(static_cast<float*>(external_array), ext_array_length);
return(EXT_TYPES::RegisterNew(data_link));
}
case 'B':
{
ExtArrayExporter<bool> * data_link = new ExtArrayExporter<bool>(static_cast<bool*>(external_array), ext_array_length);
return(EXT_TYPES::RegisterNew(data_link));
}
}
问题:
ExtArrayExporter
当需要两种类型并且我有两个来自 Unity 的字符时,我该如何实现?
琐碎的语句是堆积的switch
语句,但随着要考虑的类型越来越多并且是重复的,它会迅速增长。
我希望我可以为变量分配一个类型,以保留上面的方法,但显然这不会编译:
auto type_a = int;
C++ 是否为这种情况提供了任何平滑的解决方案?
解决方案
我不知道ExtArrayExporter
,EXT_TYPES
等等,所以我提出了一个通用代码,您可以根据自己的需要进行调整。
它基于递归可变参数模板foo()
函数,如下所示
// ground case
template <typename ... Ts>
void foo ()
{ /* do something with Ts... */ }
// recursive case
template <typename ... Ts, typename ... Cs>
auto foo (char c0, Cs ... cs)
{
switch ( c0 )
{
case 'I':
return foo<Ts..., int>(cs...);
break;
case 'F':
return foo<Ts..., float>(cs...);
break;
case 'B':
return foo<Ts..., bool>(cs...);
break;
// ...
}
}
您可以按如下方式使用它
foo<>('I', 'B', 'F', 'B', 'B', 'I');
或者也简单地说
foo('I', 'B', 'F', 'B', 'B', 'I');
这个想法是每次调用都foo()
使用一个char
参数,将其转换为模板参数并将其添加到Ts...
可变参数列表中;当 char 参数结束(基本情况)时,您可以使用已解析的Ts...
模板参数。
请注意,此解决方案是通用的,并且不仅适用于 2,而且适用于未定义数量的参数。
推荐阅读
- cordova - 带有cordova的Phonegap App,无法安装插件
- javascript - 关闭应用程序时如何根据推送通知更新 UI(React Native)
- traffic - 如何从 mininet 中的跟踪文件生成流量?
- cordova - 离子项目中的cordova-plugin-file-downloader插件如何?
- python - word2Vec 和缩写
- azure-logic-apps - 如何从 Azure Functions 在 Azure Logic App Workflow 中动态添加 SFTP 文件路径
- angular - 如何在不使用 ngbTooltip 的情况下在 Angular 4 应用程序中实现 bootstrap 4 工具提示?
- php - PHP curl:在保存到文件之前检查错误响应
- php - 使用开始时间和结束时间制定给定分钟的时间表
- python - 用于关闭 impala 查询的 Python 脚本。我正在使用 urllib 和 json 库