tl; dr:有沒有方法可以將當前範圍的默認參數添加到C++中的所有隱式構造函數中?轉換構造函數的隱式參數
我目前正在爲C++中的嵌入式語言設計一個接口。目標是創建類型安全和方便的句法正確的表達式。現在,我認爲學習像boost :: proto這樣的重量級實現會在開發過程中產生太大的延遲,所以我試圖推出我自己的實現。
這裏是一個小的演示:
#include <iostream>
#include <string>
#include <sstream>
class ExprBuilder
{
public:
ExprBuilder(const int val) : val(std::to_string(val)) {}
ExprBuilder(const std::string val) : val(val) {}
ExprBuilder(const char* val) : val(val) {}
ExprBuilder(const ExprBuilder& lhs, const ExprBuilder& arg) {
std::stringstream ss;
ss << "(" << lhs.val << " " << arg.val << ")";
val = ss.str();
}
const ExprBuilder operator()(const ExprBuilder& l) const {
return ExprBuilder(*this, l);
}
template<typename... Args>
const ExprBuilder operator()(const ExprBuilder& arg, Args... args) const
{
return (*this)(arg)(args...) ;
}
std::string val;
};
std::ostream& operator<<(std::ostream& os, const ExprBuilder& e)
{
os << e.val;
return os;
}
int main() {
ExprBuilder f("f");
std::cout << f(23, "foo", "baz") << std::endl;
}
正如你所看到的,它是相當簡單的使嵌入由於C表達式++重載和隱式轉換。
但是我面臨着一個實際問題:在上面的例子中,所有的數據都是以std :: string對象的形式進行分配的。在實踐中,我需要一些更復雜的東西(AST節點),它們分配在堆上並由專用所有者管理(遺留代碼,不能更改)。所以我必須通過一個獨特的論點(所有者)並將其用於分配。我寧願不在這裏使用靜態字段。
我正在尋找的是一種使用方法,每次使用建造者時都要求用戶提供這樣的所有者,但方式很簡單。像動態範圍的變量會很棒。有沒有辦法在C++中獲得以下內容:
class ExprBuilder
{
...
ExprBuilder(const ExprBuilder& lhs, const ExprBuilder& arg) {
return ExprBuilder(owner.allocate(lhs, rhs)); // use the owner implicitly
}
...
};
int main() {
Owner owner; // used in all ExprBuilder instances in the current scope
ExprBuilder f("f");
std::cout << f(23, "foo", "baz") << std::endl;
}
這可能嗎?
編輯:我想澄清我爲什麼(到目前爲止)不考慮全局變量。業主必須在某個時候由建築商的用戶手動發佈,因此我無法創建一個專案。因此,用戶可能完全「忘記」所有者。爲了避免這種情況,我正在尋找一種方式來強化typechecker的所有者的存在。
我想你說的是某種形式的'全球variable' –
您可以設置'Owner' RAII靜態/全局變量,並使用'ExprBuilder'是全局變量。 – Jarod42
您的意思是使用unique_ptr作爲全局變量以確保它僅用於上下文中並且必須明確保留?如果指針被用戶遺忘,會不會產生運行時錯誤? – choeger