[英]Is it possible to ensure a constexpr function is called at most once at compile time?
[英]Can I ensure object created only once during compile time?
通過斷言在編譯時創建的對象並避免動態對象來避免運行時出現問題
讓我們假設有許多硬件資源不能被應用程序的兩個模塊使用。 比如說 Pins。 有不同的硬件配置和不同的構建完成 - 確保一個硬件資源(如最簡單情況下的引腳)只使用一次而不在運行時檢查它會很棒。
template <uint8_t pin>
struct Pin {
static constexpr uint8_t Number = pin;
/*.... */
}
然后我可以創建
Pin<1> pin1;
Pin<2> pin2;
我想知道當我再次聲明相同的 pin 時是否會出現編譯錯誤/斷言:
Pin<2> pin2duplicate;
是的,可以保證只有一個實例在處理 pin 的數據表示,也可以為一個應用程序提供多個翻譯單元。
想法:將模板類的所有數據成員設為靜態。 因此,所有成員在所有情況下都是相同的。 這應該會導致預期的行為。 由於每種類型(並且每個模板實例都是一種類型)都有自己的數據,因此您可以有多個引腳,每個引腳都有自己的一組數據。
例子:
template <uint8_t pin>
struct Pin
{
static constexpr uint8_t Number = pin;
static bool state;
void SetState( bool newState ) { state = newState; }
bool CheckState() const { return state; }
};
template< uint8_t pin >
bool Pin<pin>::state = false;
int main()
{
Pin<1> p1;
Pin<1> p1duplicate;
Pin<2> p2;
std::cout << p1.CheckState() << std::endl;
std::cout << p1duplicate.CheckState() << std::endl;
std::cout << p2.CheckState() << std::endl;
p1.SetState(true);
std::cout << p1.CheckState() << std::endl;
std::cout << p1duplicate.CheckState() << std::endl; // here we have the data also changed in the duplicate
std::cout << p2.CheckState() << std::endl; // as you can see, p2 is not changed as required.
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.