如何创建公开泛型函数的 DLL

How to create a DLL exposing a generic function?

本文关键字:泛型 函数 DLL 何创建 创建      更新时间:2023-10-16

我想公开泛型Timer。问题是我不知道为什么extern被红色下划线,Visual Studio 2019社区说"不允许链接规范"。

问题

extern的正确语法是什么?

最小工作示例

标题utilities.hpp

#pragma once
#ifdef UTILITIES_EXPORTS
#define UTILITIES_API __declspec(dllexport)
#else
#define UTILITIES_API __declspec(dllimport)
#endif
namespace Utilities
{   
    template<typename F>
    extern "C" UTILITIES_API void Timer(F f, unsigned int N = 1);
}

定义文件utilities.cpp

#include "Timer.h"
#include <iostream>
#include <vector>
#include <chrono>
#include <iomanip>
using namespace std;
namespace Utilities 
{
    template<typename F>
    void Timer(F f, unsigned int N)
    {
        cout << fixed << setprecision(9);
        vector<unsigned int> results;
        const double million = 1'000'000'000.0;
        for (unsigned int i = 0; i < N; i++)
        {
            chrono::steady_clock::time_point begin = chrono::steady_clock::now();
            f();
            chrono::steady_clock::time_point end = chrono::steady_clock::now();
            unsigned int interval = chrono::duration_cast<chrono::nanoseconds>(end - begin).count();
            results.push_back(interval);
            double elapsedTime = interval / million;
            cout << "Elapsed: tt" << elapsedTime << " s." << endl;
        }
        unsigned long long sum = 0;
        for (unsigned int x : results)
            sum += x;
        double totalElapsedTime = sum / million / results.size();
        cout << "tttAverage elapsed: " << totalElapsedTime << " s." << endl;
    }
}

编译器必须知道你对泛型使用什么类型,因为它基本上必须制作一个使用该类型的 Timer 的副本。

对于 extern 方法,没有办法知道这一点,并且必须在运行时对其进行计算,这不是泛型的工作方式。这是一个编译器功能。

您可以为特定类型制作包装器并制作该 extern。