我想創建一個只接受某些類型參數的模板。對於所有剩餘類型,我希望產生編譯時錯誤消息。所以我寫了下面的如何約束模板參數
------ 1版------
template <typename T_,bool isError = true>
struct Error {
static_assert(!isError, "Invalid Type");
};
template <typename T_>
struct Wrapper : Error <T_> {
private:
T_ value_;
};
template <>
struct Wrapper<int> : Error<int, false> {
private:
int value_;
};
int main()
{
Wrapper<int> wi;
Wrapper<long> wl; // I get the Invalid Type.
}
因爲我沒有使用類型參數T_
我刪除它和代碼停止工作。
------第2版------
template <bool isError = true>
struct Error {
static_assert(!isError, "Invalid Type");
};
template <typename T_>
struct Wrapper : Error <> {
private:
T_ value_;
};
template <>
struct Wrapper<int> : Error<false> {
private:
int value_;
};
int main()
{
Wrapper<int> wi; // I get Invalid type ?????
Wrapper<long> wl; // I get the Invalid Type.
}
我的問題是。爲什麼在刪除類型參數後發生這種情況?這個解決方案是否「乾淨」?或者存在更好的方式來實現我的意圖?
你即使沒有遇到錯誤'無線/ wl'。因爲'Error*true*/>'被實例化。 – Jarod42
當你移除'T_'時,''Wrapper''模板的基類'Error <>'不再依賴於模板參數,所以它不需要實例化'Wrapper'本身。正如Joard指出的那樣,即使你有一個空的'main',你也會遇到錯誤。 –
Praetorian