[英]Partial specialization or instantiation of template class method
我有帶有幾個模板參數的模板結構
template<class Result, class T, class K>
struct MyClass
{
public:
Result foo()
{
return Result{};
}
};
此結構適用於所有模板,但 Result 為空的情況除外。 我明白, Result{}
不能實現為 void 類型,所以我目前的解決方案是使用像這樣的部分專業化:
template<class T, class K>
struct MyClass<void, T, K>
{
public:
void foo()
{
return;
}
};
這允許執行以下操作:
int main()
{
MyClass<void, double, char> mycl1;
MyClass<int, double, char> mycl2;
mycl1.foo();
mycl2.foo();
}
有沒有辦法讓mycl1.foo()
在 C++ 14 標准中沒有部分類特化的情況下編譯? 我可以使用if constexr
和 type trait is_void_v
組合,但我想找到是否有辦法:
模板類方法部分顯式的特化
模板類方法的實例化
雖然你做不到
Result foo()
{
return Result{};
}
如果Result
為void
,則可以使用
Result foo()
{
return Result();
}
這種情況下的行為是相同的,您將得到一個返回的值初始化對象。 當[expr.type.conv]\\2 Result
為void
,允許使用此語法
如果初始值設定項是帶括號的單個表達式,則類型轉換表達式等效於(在定義中,如果在含義中定義)對應的強制轉換表達式。 如果類型是 cv void 並且初始化器是 (),則表達式是不執行初始化的指定類型的純右值。 否則,表達式是指定類型的純右值,其結果對象是用初始化程序直接初始化的。 對於 T() 形式的表達式,T 不應是數組類型。
即將推出,但您將能夠使用
return Result{};
即使Result
為void
作為 C++20 添加到該部分, {}
也適用於void
。 [expr.type.conv]\\2現在聲明
如果初始值設定項是帶括號的單個表達式,則類型轉換表達式等效於相應的強制轉換表達式。 否則,如果類型是 cv void 並且初始化器是 () 或 {} (在包擴展之后,如果有),則表達式是不執行初始化的指定類型的純右值。 否則,表達式是指定類型的純右值,其結果對象是用初始化程序直接初始化的。 如果初始值設定項是帶括號的可選表達式列表,則指定的類型不應是數組類型。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.