簡體   English   中英

模板類方法的部分特化或實例化

[英]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{};
}

如果Resultvoid ,則可以使用

Result foo()
{
    return Result();
}

這種情況下的行為是相同的,您將得到一個返回的值初始化對象。 [expr.type.conv]\\2 Resultvoid ,允許使用此語法

如果初始值設定項是帶括號的單個表達式,則類型轉換表達式等效於(在定義中,如果在含義中定義)對應的強制轉換表達式。 如果類型是 cv void 並且初始化器是 (),則表達式是不執行初始化的指定類型的純右值。 否則,表達式是指定類型的純右值,其結果對象是用初始化程序直接初始化的。 對於 T() 形式的表達式,T 不應是數組類型。

即將推出,但您將能夠使用

return Result{};

即使Resultvoid作為 C++20 添加到該部分, {}也適用於void [expr.type.conv]\\2現在聲明

如果初始值設定項是帶括號的單個表達式,則類型轉換表達式等效於相應的強制轉換表達式。 否則,如果類型是 cv void 並且初始化器是 () 或 {} (在包擴展之后,如果有),則表達式是不執行初始化的指定類型的純右值。 否則,表達式是指定類型的純右值,其結果對象是用初始化程序直接初始化的。 如果初始值設定項是帶括號的可選表達式列表,則指定的類型不應是數組類型。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM