我有一個類型的樹層次結構,每個都由字符串來定義,這樣的事情:類型的層次結構與編譯類型檢查
com
com.example
com.example.shape
com.example.shape.triangle
com.example.shape.triangle.equilateral
com.example.shape.triangle.isosceles
com.example.shape.triangle.right
com.example.shape.quadrilateral
com.example.shape.quadrilateral.rectangle
com.example.shape.quadrilateral.squere
類型定義了動態參數的一些數據,可以在改變運行時,所以無法創建編譯時類型層次結構。因此,每個實體只是一個類型名稱(字符串)和參數列表,您可以隨時在系統中註冊一個新類型。儘管如此,很多類型都是預定義的,並且可以在系統啓動時註冊。爲了在運行時創建和預定義的數據具有相同的體驗,我使用這個動態表示。對於預定義的類型,我希望有一種機制可以在編譯時驗證類型名稱,並且我不想在每次必須使用代碼時將字符串直接放入代碼中,可以通過定義字符串常量表達式來解決它,但是它不是很好,像這樣:
string some_type = "com.example.type1";
...
registerType(some_type, parameters_definition);
所以我想到一個更好的方法。
另一種方法是讓這樣的事情:
#include <iostream>
#include <string>
struct Base {
Base(std::string parent_name, std::string my_name) : name_(parent_name + "." + my_name) {}
std::string name_;
};
std::ostream& operator<< (std::ostream& os, const Base& base) {
os << base.name_;
return os;
}
struct G : Base {
G(std::string parent_name, std::string my_name) : Base(parent_name, my_name) {}
};
struct F : Base {
F(std::string parent_name, std::string my_name) : Base(parent_name, my_name) {}
G rectangle{name_, "rectangle"};
G squere{name_, "squere"};
};
struct E : Base {
E(std::string parent_name, std::string my_name) : Base(parent_name, my_name) {}
};
struct D : Base{
D(std::string parent_name, std::string my_name) : Base(parent_name, my_name) {}
E equilateral{name_, "equilateral"};
E isosceles{name_, "isosceles"};
E right{name_, "right"};
};
struct C : Base {
C(std::string parent_name, std::string my_name) : Base(parent_name, my_name) {}
D triangle{name_, "triangle"};
F quadrilateral{name_, "quadrilateral"};
};
struct B : Base{
B(std::string parent_name, std::string my_name) : Base(parent_name, my_name) {}
C shape{name_, "shape"};
};
struct A {
A(std::string my_name) : name_(my_name) {};
std::string name_;
B example{name_, "example"};
};
std::ostream& operator<< (std::ostream& os, const A& a) {
os << a.name_;
return os;
}
int main() {
A com("com");
std::cout << com << std::endl;
std::cout << com.example << std::endl;
std::cout << com.example.shape << std::endl;
std::cout << com.example.shape.triangle << std::endl;
std::cout << com.example.shape.triangle.equilateral << std::endl;
std::cout << com.example.shape.triangle.isosceles << std::endl;
std::cout << com.example.shape.triangle.right << std::endl;
std::cout << com.example.shape.quadrilateral << std::endl;
std::cout << com.example.shape.quadrilateral.rectangle << std::endl;
std::cout << com.example.shape.quadrilateral.squere << std::endl;
return 0;
}
這是很好用,尤其是具有代碼提示IDE,但遺憾的是不容易做定義。每個不同的樹級別都需要用新成員定義新類,該名稱與某些字符串相對應。
我正在尋找更好的解決方案 - 更簡單。將它定義爲某種模板專門化會很棒,但我不知道該怎麼做。
歡迎任何建議:) Regards, Piciu。
我認爲這不僅僅是打印字符串的複雜方式。這個命名層次究竟是什麼?這將有助於更好地理解底層問題,而不僅僅是當你看到它在解決方案的特定部分看到你的嘗試 – Smeeheey