是否有可能根據某個東西是否爲常量表達式來覆蓋函數和/或模板?重寫常量表達式?
基本上我想要做的是建立一個字符串類,如果在一個遞給一個靜態字符串或constexpr變量指向,它會簡單地使用指針,以後不會嘗試將其刪除。另一方面,如果類傳遞了緩衝區,它需要複製它或採用它,然後在析構函數中將其刪除。
我認爲最接近的可能是使用強類型定義,並要求程序員在該typedef下聲明他/她的靜態字符串。我想知道,如果那些比我更聰明的人能想出一些不需要的東西。
是否有可能根據某個東西是否爲常量表達式來覆蓋函數和/或模板?重寫常量表達式?
基本上我想要做的是建立一個字符串類,如果在一個遞給一個靜態字符串或constexpr變量指向,它會簡單地使用指針,以後不會嘗試將其刪除。另一方面,如果類傳遞了緩衝區,它需要複製它或採用它,然後在析構函數中將其刪除。
我認爲最接近的可能是使用強類型定義,並要求程序員在該typedef下聲明他/她的靜態字符串。我想知道,如果那些比我更聰明的人能想出一些不需要的東西。
基本上我想要做的是建立一個字符串類,如果在一個遞給一個靜態字符串或constexpr變量指向,它會簡單地使用指針,以後不會嘗試將其刪除。
我認爲我們在這裏面臨XY-problem。瞭解表達式是否爲constexpr
不會告訴您是否適合delete
。
我會說這個函數不應該試圖猜測是否刪除這個動作是否有可能不合適。我相信來電者應該照顧,可能使用智能指針而不是照顧。
換句話說,我會讓該函數接受一個左值引用,並讓該客戶端解引用一個指針,如果指向的對象必須作爲參數傳遞給該函數。
我會說這種模式是有道理的不只是在delete
的情況:更一般地,如果一段代碼具有決定一些值是如何應生成或計算(如對象分配),那麼也的責任爲正確地執行一些相關的或相應的行動責任(如清理)應該屬於同一段代碼:
void foo(my_object& o)
{
// ...
}
my_object o;
foo(o);
// The argument has automatic storage, no need to delete
my_object* pO = new my_object();
foo(*pO);
// The argument was allocated through operator new, we must
// deallocate it through a corresponding call to delete
delete pO;
如果你真的想清理到發生的功能,你應該給客戶一個辦法ELL功能如何執行它:
void foo(my_object& o, bool shouldDelete)
{
// ...
if (shouldDelete) { delete &o; }
}
my_object o;
foo(o, false); // "And don't try to deallocate this object please..."
my_object* pO = new my_object();
foo(*pO, true); // "Please, delete it for me" (we are delegating the
// responsibility of performing the material action,
// but not the one of knowing how!)
要允許更大的靈活性,你甚至可以接受一個可調用的對象,這使得更清楚我在上面的評論的意思是「委託執行資料的責任動作,但不知道的一個人如何「:
#include <functional>
void foo(my_object& o, std::function<void()> f = []() { })
{
// ...
f();
}
int main()
{
my_object o;
foo(o); // "And don't do anything with this object when you're done..."
my_object* pO = new my_object();
foo(*pO, [=]() { delete pO; }); // "Please, do exactly this when done..."
}
如果您不需要確定調用對象的在運行時的類型,你甚至可以考慮將foo()
成一個函數模板。
最後,關於如何確定一個表達式是否是一個常量表達式你原來的問題,這不是一般的可能,但也有一些技巧,可以幫助你在某類情況 - 只需要知道他們的侷限性。在這方面,您可能會發現this Q&A on StackOverflow有關。
我很明白地問過我想回答的問題。不管怎麼說,還是要謝謝你。 – 2013-03-14 21:28:14
@CrazyEddie:如果你是低調的,我想解釋一下。除了指出你的方法可能無法確定是否安全或者不能刪除,我的答案也會回答你有問題的問題,因爲它會告訴你如何確定一個表達式是否是一個常量表達式的相關問答。 – 2013-03-14 21:41:03
根據你的解釋,我不明白爲什麼你應該把一個文件範圍數組與塊範圍數組區別開來。前者是一個地址常量表達式,後者不是,但都不應該被刪除。 – hvd 2013-03-14 18:09:49
你的意思是過載而不是重載,對吧? – GManNickG 2013-03-14 18:11:40
不幸的是,沒有辦法找到傳遞的參數是否最初是一個常量表達式,而不需要用戶告訴你。 – Xeo 2013-03-14 18:11:54