c++ - 来自变量的模板类型

标签 c++ templates interop

对于 Unity (C#) 和 C++ 插件之间的接口(interface),我需要能够使用 Unity 中定义的两个模板参数来实例化一个类。
我不能直接传递 C++ 类型,所以我改用 charswitch陈述。

对于单个参数,它看起来像这样:

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,而且适用于未定义数量的参数。

关于c++ - 来自变量的模板类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60023170/

相关文章:

c++ - 带缓冲区的iostreams的机制是什么?

c++ - 有没有办法从一个文件访问所有 Clib 函数?

c++ - 这是 gcc 的重载解析中的错误吗?

wpf - 在 WPF 中将 slider 值绑定(bind)到 slider 的高度

c# - 从 C# 到 C++ 非托管代码的多个函数调用导致 AccessViolationException

c# - 在 C# 中将结构数组编码到指针

c++ - 错误 C2065 : 'MIIM_STRING' : undeclared identifier

php - CodeIgniter 创建布局/模板库

C++多重继承静态函数调用歧义

c# - 如何将数据从 C# 传递到 C++(仅指针,无编码)