這個問題需要C++模板元編程的知識,因爲涉及(間接)表達式模板。我間接地說,因爲它不是直接表達模板的問題,而是涉及C++類型的計算。如果你不知道那是什麼,請不要回答這個問題。讓編譯器做出最終選擇使用哪種類型
避免把出了一道題沒有足夠的背景資料,讓我闡述我試圖解決,然後去到更具體的部位一般問題一點。
假設您有一個圖書館,提供Integer
s,用戶可以像使用int
s一樣進行計算。 此外,可以從int
構建Integer
。就像:
Integer<int> i(2);
內部我Integer
類是類模板:
template<class T>
class Integer {
// cut out
};
因此,我可以把它定義在任何整數類型,我喜歡。
現在不改變API,我想更改庫的方式,如果Integer
是從一個int
構造應該通過內部不同類型的代表,說IntegerLit
。這樣做的原因是,我可以加快一些計算知道的Integer
一個實例是從一個int
創建(可將它作爲int
參數的函數,而不是如由基指針+單獨的數據。這裏所描述的一般目的只是作爲一個評論。)
重要的是,從int
施工時,因爲我需要編譯器佔用不同的代碼路徑取決於是否從int
或並非建造的類型是不同的。我不能用運行時數據標誌來做到這一點。 (原因總之:編譯器生成一個函數,可以使用int
或上面提到的更一般類型的對象,具體取決於類型。)
說到這裏,我遇到了一個問題:當使用類似於這樣的:
Integer<int> a,b(2);
a = b + b;
這裏a
應該是一般Integer
和b
專業IntegerLit
。但是,我的問題是如何在C++中表達這一點,因爲用戶可以自由地使用非常相同的類型Integer
來定義她的變量。
使類型的多態,即派生IntegerLit
從Integer
將無法正常工作。它看起來好一會兒。然而,由於用戶創建了Integer
(基類)的實例,因爲它是編譯器粘貼到表達式樹中的基類(這就是表達式模板涉及到問題的原因),所以它不會工作。所以在這兩種情況之間再也沒有區別。做一個RTTI檢查動態演員陣容真的不是我想要的那一點。
更有希望的是,似乎將字面模板參數bool lit
添加到說明是否由int
構建的類型。重點是不指定一個非文字轉換規則,而是爲其他情況指定轉換規則。
但是,我無法得到這個工作。如果不是從int
構建,以下代碼僅編譯(GCC 4.7 C++ 11)。否則,它會失敗,因爲未將整數指定爲true
作爲3210的值。所以編譯器搜索沒有轉換規則的默認實現。這不是更改API的選項,並且在從int
構建時需要編寫Integer<int,true>
。
template<class T,bool lit=false>
class Integer
{
public:
Integer() {
std::cout << __PRETTY_FUNCTION__ << "\n";
}
T F;
};
template<>
template<class T>
class Integer<T,true>
{
public:
Integer(int i) {
std::cout << __PRETTY_FUNCTION__ << "\n";
}
T F;
};
我開始想知道這樣的事情是否可以用C++。
C++ 11的新功能可以幫助嗎?
您的代碼通常無效,因爲'Integer'是一個類模板,需要一個模板參數來創建它的一個對象。只是'整數a(2);'是一個錯誤。 – Xeo
對,我在這裏簡化了。實際上,用戶使用'typedef'-ed類型,例如專門用'Integer'和'int'。 – ritter
你的意思是從'int'構造還是從整數文字構造?有一個重大的區別。 –