【问题标题】:D2: How to explicitly instantiate a templated function in a DLL?D2:如何在 DLL 中显式实例化模板化函数?
【发布时间】:2012-02-11 22:56:56
【问题描述】:

我有一个 D2 类型的模板函数:

void AddToAry( InTy, AcTy )( in InTy[] InAry,  ref AcTy[] AcAry )  {    

    for( uint i=0; i<InAry.length; i++ )  AcAry[i] += InAry[i];                     
}

我希望显式实例化它,以便此函数代码为 由 DLL 导出,用于不同的 arg 类型组合。

我尝试使用三个一致的函数装饰来做到这一点..

export {
    void  AddToAry( float,  float  );
    void  AddToAry( float,  double );
    void  AddToAry( double, double );
}

但是尝试编译会产生..

AccumAry_DLL.d(37): Error: function AccumAry_DLL.AddToAry conflicts with   template AccumAry_DLL.AddToAry(InTy,AcTy) at AccumAry_DLL.d (23)

如何告诉 D2 dmd 编译器实例化然后从 DLL 导出适当类型的代码? .. 或者可能需要使用 D2 mixin 模板来代替?

现在我的工作是使用显式类型的代理函数。这样做 我将模板化的泛型函数重命名为不冲突,然后像这样导出显式实例化的代理:

export {  // Hopefuly these proxy functions will be "inlined", and ther is no real forwarding overhead.
    void AddToAry( in  float[] InAry,  ref  float[] AcAry )  { _AddToAry( InAry, AcAry ); }
    void AddToAry( in  float[] InAry,  ref double[] AcAry )  { _AddToAry( InAry, AcAry ); }
    void AddToAry( in double[] InAry,  ref double[] AcAry )  { _AddToAry( InAry, AcAry ); }
}  // end export

这行得通,然后我问是否有办法确保 D@ 编译器不会构造代理的额外转发开销级别?

【问题讨论】:

    标签: templates dllexport d


    【解决方案1】:

    确保内联发生的一种非常简单的方法是在这里简单地使用字符串混合。 (模板 mixin 并不真正适用,因为它们引入了声明,而您需要引入声明。)

    private enum _AddToAry = `for(size_t i = 0; i < InAry.length; i++)  AcAry[i] += InAry[i];`
    extern 
    {
        void AddToAry( in  float[] InAry,  ref  float[] AcAry )  { mixin(_AddToAry); }
        void AddToAry( in  float[] InAry,  ref double[] AcAry )  { mixin(_AddToAry); }
        void AddToAry( in double[] InAry,  ref double[] AcAry )  { mixin(_AddToAry); }
    }
    

    请注意,这依赖于参数命名一致的事实。但是,如果您需要/想要更改它,您可以创建一个简单的函数,该函数接受参数的名称并返回适当的字符串。

    【讨论】:

      【解决方案2】:

      我想

      void AddToAry!( float, float )( in float[], ref float[] );

      应该可以工作,类似于 C++。 您正在尝试声明非模板函数 - 它们的签名显然与您的模板冲突。

      附:没查过,只是猜测。

      【讨论】:

        猜你喜欢
        • 2011-06-23
        • 1970-01-01
        • 2019-04-15
        • 1970-01-01
        • 2014-02-26
        • 1970-01-01
        • 1970-01-01
        • 2013-02-09
        • 1970-01-01
        相关资源
        最近更新 更多