我正在考虑如何创建从模板基类派生的所有类的列表。
首先我想要一个模板基类:
template <typename T>
class Base
{
public:
Base() {};
virtual ~Base() {};
};
Run Code Online (Sandbox Code Playgroud)
以及一个继承自模板基类的类:
class Foo : public Base<Foo >
{
public:
Foo () {};
virtual ~Foo () {};
};
Run Code Online (Sandbox Code Playgroud)
可能还有任意数量的其他子类,例如Foo. 结果应该看起来像这样:
std::vector<std::string> allTemplates = Base<Base>::getAllTemplateClasses();
Run Code Online (Sandbox Code Playgroud)
我的问题是是否可以在编译时创建所有子类的列表?魔术应该发生在基础班上,或者在儿童班上花费很少的努力。
我之前一直在思考不同的方向。首先我认为可以使用constexpr. 就像每个子类都需要一个带有签名的静态函数:
constexpr static std::string name() { "Foo";}
Run Code Online (Sandbox Code Playgroud)
或者认为也许可以使用元编程并创建一个编译时列表,例如使用 Template-Meta 的编译时数据结构示例。这里的问题是我不知道模板创建的头部。
接下来我正在考虑使用宏并构建一个枚举结构,就像这样枚举结构扩展一样。所以我找不到解决这个问题的办法,我想问你是否有可能?
编辑:
说清楚:我想要一个子对象的列表,而不需要创建它们。
我想问一下您在单元测试应用程序中获取经过测试的源的经验。以下结构
NiceLib
|-src
|- MyNiceClass.h
|- MyNiceClass.cpp
|- CMakeLists.txt
|-test
|- tester_MyNiceClass.cpp
|- main.cpp
|- CMakeLists.txt
Run Code Online (Sandbox Code Playgroud)
在 src 中编译了一个库。在测试中,构建了一个测试可执行文件。在测试应用程序中实现 MyNiceClass.cpp 的最佳实践是什么。目前我知道两个选项。选项一是链接到测试可执行文件中的库。test\CMakeLists.txt 看起来像:
enable_testing()
include_directories(../src/)
add_executable(tester_NiceLib
main.cpp
tester_MyNiceClass.cpp
)
add_test(NicLibTest tester_NiceLib)
target_link_libraries(tester_NiceLib NiceLib)
Run Code Online (Sandbox Code Playgroud)
第二种解决方案是:
enable_testing()
include_directories(../src/)
add_executable(tester_NiceLib
main.cpp
tester_MyNiceClass.cpp
../src/MyNiceClass.h
../src/MyNiceClass.cpp
)
add_test(NicLibTest tester_NiceLib)
Run Code Online (Sandbox Code Playgroud)
您的经验是什么?您有任何最佳实践或其他解决方案吗?
我已经测试了C++ 11中的Semantic移动.我用移动构造函数编写了一个类.
class DefaultConstructor
{
public:
DefaultConstructor(std::vector<int> test) :
m_vec(std::forward<std::vector<int>>(test))
{
};
DefaultConstructor(DefaultConstructor &&def) :
m_vec(std::forward<std::vector<int>>(def.m_vec))
{
}
DefaultConstructor& operator=(DefaultConstructor&& def) {
m_vec = std::move(def.m_vec);
return *this;
}
DefaultConstructor& operator=(const DefaultConstructor&) = delete;
DefaultConstructor(DefaultConstructor &) = delete;
std::vector<int> m_vec;
};
Run Code Online (Sandbox Code Playgroud)
我写了一个使用移动语义的主函数.我理解移动语义中发生的事情,它是很棒的工具.但是有些行为对我来说是不可解释的.当我打电话DefaultConstructor testConstructor2 = std::move(testConstructor);给我的主要功能DefaultConstructor& operator=(DefaultConstructor&& def)应该叫.但Visual Studio 2015调用了移动构造函数.
int main()
{
std::vector<int> test = { 1, 2, 3, 4, 5 };
DefaultConstructor testConstructor(std::move(test));
DefaultConstructor testConstructor2 = std::move(testConstructor);
DefaultConstructor &testConstructor3 = DefaultConstructor({ 6, 7, 8, 9 }); …Run Code Online (Sandbox Code Playgroud) c++ ×3
c++11 ×1
c++14 ×1
cmake ×1
compilation ×1
move ×1
templates ×1
type-traits ×1
unit-testing ×1