2015-12-01 69 views
1

我有一個Builder類,它具有許多設置方法(具有各種名稱和參數)。我需要允許最多調用4個這些方法,而不再需要其他方法。如果調用了4個以上的函數,我顯然會產生運行時錯誤,但是我想生成一個編譯器錯誤。這將是一個編程錯誤,我希望有機會修復它(決定保留哪些4個調用),而不是等到它在運行時失敗(在這種情況下,我將不得不做任何事情,就像忽略第五個)。我需要一個使用標準C++的解決方案,但不需要新的C++ 11功能。下面是5個調用的例子(它應該在第五個調用上產生編譯器錯誤)。在C++中函數調用次數的編譯時間限制

Builder builder(); 
builder.setA(1); 
builder.setB(1.3); 
builder.setC("sss"); 
builder.setD(0); 
builder.setE(3, "aaa"); 
+0

這個怎麼樣:http://stackoverflow.com/questions/14621968/how-to-do-static-assert-with-macros –

+0

對不起,但我沒有看到字符串或對在哪裏。 –

+0

如果我有函數調用次數的編譯時間計數,鏈接中的靜態聲明將非常有用。 @JerryJeremiah – user2453360

回答

2

您可以使用這樣的事情:

template <typename T, int N> 
struct result { 
    T values[N]; 
}; 

template <typename T, int I, int N> 
class builder_ { 
    T* values; 
    friend class builder_<T, I - 1, N>; 
    builder_(T* values): values(values) {} 
public: 
    builder_(result<T, N>& r): values(r.values) {} 
    builder_<T, I + 1, N> set(T const& value) { 
     *values = value; 
     return builder_<T, I + 1, N>(this->values + 1); 
    } 
}; 
template <typename T, int N> 
class builder_<T, N, N> { 
public: 
    builder_(T*) {} 
}; 
template <typename T, int N> 
builder_<T, 0, N> builder(result<T, N>& r) { 
    return builder_<T, 0, N>(r); 
} 

int main() 
{ 
    result<int, 4> r; 
    builder(r) 
     .set(1) 
     .set(2) 
     .set(3) 
     .set(4) 
     ; 
} 
+0

這個解決方案依賴於程序員總是使用set調用鏈。如果他們調用builder.setXXX()5次,它將保持設置第一個值 – user2453360

+0

@ user2453360:正確。我認爲沒有辦法靜態計算單個電話的數量。 –

+0

@ user2453360:執行正確數量的初始化器調用的潛在方法可以是使用構建器僅在結果中產生目標結果,即沿着結果行的某些東西r =構建器().set( 1).set(2).set(3).set(4);'並且只安排目標號碼的專業化可轉換爲'結果',並且不提供對'結果'的變異操作。 –