0

我想做这样的事情:

template<typename CType, unsigned int targetDimensions> struct GeneratePointerType
{
    typedef typename GeneratePointerType<CType, targetDimensions-1>::type* type;
    static const unsigned int dimensions = GeneratePointerType<CType, targetDimensions-1>::dimensions+1;
};
template<typename CType> struct GeneratePointerType<CType, 0>
{
    typedef CType type;
    static const unsigned int dimensions = 0;
};

Dictionary<int, GeneratePointerType<int, valueDimensions>::type >

所以基本上我想为指针类型实例化一个容器模板,但我不知道要在运行前创建的指针的指针级别,所以上面的方法当然不能编译,因为“维度”不是一个编译时常量。

有没有办法(与纯 C++03 兼容,没有任何 C++11 唯一功能)来实现预期的行为?

编辑:“如果你能告诉我们真正的问题,我们可能会有更好的解决方案。” “所以为了澄清,你想要一个 N 维数组/对象的映射,其中 N 是运行时值?奇怪。我无法想象一个用例”好的,让我告诉你一些关于用例的话:

我有一个类模板字典,它基本上就像 C# 或 Java 字典泛型一样。

此类在 C 库周围的 C++ 包装器库中使用。

因此,我有转换函数,可以在 C++ 容器类的实例和 C 容器结构的实例之间转换数据。

如你所知,C 没有泛型,所以在 C++ 中我可以创建这样的容器:

Dictionary<int, int**> dict;

在 CI 中必须这样做:

CDictionary dic;
dic.keytype = TYPECODE_INT;
dic.valuetype = TYPECODE_INT;
dic.valueDimensions = 2;

现在,当将 C 字典转换为 C++ 字典时,我很难生成正确数量的 *,因为存储在 C 字典中的信息不是编译时间常数。

EDIT2:实际上,我从底层 C 接口获取运行时维度计数并不重要,因为 C 库从通过网络传入的序列化数据创建这些结构,并且不可能知道库的编译时间,从另一个应用程序以可能的另一种编程语言通过网络传入的数组将具有多少个数组维数,反序列化的 C++ 实现仍然必须根据运行时信息确定字典的值类型数组维度。

EDIT3:“好的,我认为你需要说明你想如何使用这个结构,因为我显然没有正确解释你的问题,而且这些信息都不在问题中。你可以编辑一些伪代码来显示你的内容'再努力实现?” 调用公共接口:

Dictionary<int, int*> dic;
int* arr = new int[10];
dic.put(1, arr, a0);
delete arr;

send(dic); // dic gets serialized and sent over the netwowork

收到序列化的 dic 时,我想在将其传递给回调之前将其反序列化:

// read out typecodes and dimnesions from the serialized data
// [...]
// create the Dictionary from that info
switch(valueTypeCode)
{
    case TYPECODE_SHORT:
        return new Dictionary<int, GeneratePointerType<short, valueDimensions>::type>[size]();
    case TYPECODE_INTEGER:
        return new Dictionary<int, GeneratePointerType<int, valueDimensions>::type>[size]();
}
// fill it with the deserialized payload afterwards
// [...]
4

1 回答 1

0

如果参数N在编译时未知,则不能使其成为静态类型的一部分。因此,您肯定必须使用某种运行时调度。

可能的选择是:

  1. 只需对C结构进行浅层包装(提供运算符重载和其他方法,封装底层数据)并以完全相同的方式访问它

    class Dictionary {
        CDictionary *inner;
    public:
        // C++ syntactic sugar here
    };
    
  2. 如果上面N有一些合理的值(例如,你可以假设),你可以为每个有效的 N 实例化一个模板类,它实现了一个抽象接口。然后你的模板实例被隐藏在一个翻译单元中,它只公开一个公共(虚拟)接口和一个工厂函数;实际访问使用运行时多态性N < 10

    class AbstractDictionary {
    public:
        virtual ~AbstractDictionary() = 0;
        // virtual methods
    };
    AbstractDictionary* wrap(CDictionary *);
    
于 2012-08-01T17:03:19.150 回答