gpt4 book ai didi

c++ - 如何使用最小包含创建一个用模板函数包装对象的库?

转载 作者:行者123 更新时间:2023-11-30 04:37:16 25 4
gpt4 key购买 nike

该项目的目标是创建一个用于分发的库。过去,我使用前向声明,所以我不必随库一起分发一堆头文件。但是,我现在正尝试通过切换到模板来消除代码重复,但遇到了一些问题。

首先,一个简单的示例项目显示了当前正在运行的内容:

//LibraryDep1.h

class LibraryDep1
{
public:
LibraryDep1(void) {};
virtual ~LibraryDep1(void) {};

template <typename T>
int TestFunction(T value)
{
std::cout << value << std::endl;
return 0;
}
};


//LibraryInclude.h

class LibraryDep1; //forward declare

class LibraryInclude
{
private:
LibraryDep1* mLibDep1;
public:
LibraryInclude(void);
virtual ~LibraryInclude(void);

int TestFunction(int value);
int TestFunction(std::string value);


};

//LibraryInclude.cpp

#include "LibraryInclude.h"
#include "LibraryDep1.h"


LibraryInclude::LibraryInclude(void)
{
this->mLibDep1 = new LibraryDep1();
}


LibraryInclude::~LibraryInclude(void)
{
delete this->mLibDep1;
}

int LibraryInclude::TestFunction(int value)
{
return this->mLibDep1->TestFunction(value);
}

int LibraryInclude::TestFunction(std::string value)
{
return this->mLibDep1->TestFunction(value);
}

//main.cpp
#include <tchar.h>
#include "LibraryInclude.h"

int _tmain(int argc, _TCHAR* argv[])
{
LibraryInclude inclLibrary;
inclLibrary.TestFunction(77);
inclLibrary.TestFunction("test");
}

这给出了预期的输出:

77
test

但是,LibraryInclude::TestFunction 的重载可以替换为模板函数以进一步减少代码重复:

//LibraryInclude.h

class LibraryDep1; //forward declare

class LibraryInclude
{
private:
LibraryDep1* mLibDep1;
public:
LibraryInclude(void);
virtual ~LibraryInclude(void);

template <typename T>
int TestFunction(T value) {
return mLibDep1->TestFunction(value);
}

};

现在的问题是我在使用 mLibDep1 时没有包含完整的实现,这给我一个未定义类型的编译错误。这意味着我需要在 LibraryInclude.h 中 #include "LibraryDep1.h",因此需要我将 LibraryInclude.h 和 LibraryDep1.h 与我的库一起分发。这是一个简单的示例,如果我切换到使用 LibraryInclude 的模板化版本,实际项目有很多头文件需要分发。

我的问题是,有什么方法可以避免在我的库中分发一堆包含文件并消除代码重复?或者,我是否最好只在分布式头文件中重载所有已知类型(大大降低库的灵 active )并将模板仅保留在底层类中?

最佳答案

没有。目前没有办法做你想做的事。当编译器供应商开始实现“export”关键字时,您就走运了。目前我只知道Comeau这样做。这个关键字已经存在多年,所以在其他人实现它之前我不会屏住呼吸。

关于c++ - 如何使用最小包含创建一个用模板函数包装对象的库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4019327/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com