簡體   English   中英

僅專業化 class 模板的一種方法

[英]Specializing only one method of a class template

我有一個 class 模板,它適用於所有可能的類型 T1、T2。

template <typename T1, typename T2>
class Basic {
    int a;
    float b;

public:
    void foo(T1 t1, T2 t2) {
        // use a, b, t1, t2
    }
};

但是,有一種情況是T2char ,我希望foo表現不同。

所以我嘗試專注於該方法:

template <typename T1>
class Basic<T1, char> {
    void foo(T1 t1, char t2) {
        // try using a, b, t1, t2 in a very special way

        // ERROR:
        // use of undeclared identifier: a
        // use of undeclared identifier: b
    }
};

問題是,模板 class Basic中可能有很多不同的數據成員和方法,它們不一定與 function foo相關。

話雖如此,我覺得完全的 class 專業化會很臃腫。 有更好的解決方案嗎?

T2char時,您可以使用std::is_samefoo中執行其他操作:

void foo(T1 t1, T2 t2) {
   if (std::is_same<T2, char>::value)
     std::cout << "char";
   else
     std::cout << "not char";
}

為此,您不需要Basic的完全專業化,甚至不需要foo的專業化。

這是一個演示

從 c++17 開始,您甚至可以避免編譯不需要的分支(即僅在T2char時編譯char分支,反之亦然),使用if constexpr ,如下所示:

if constexpr (std::is_same<T2, char>())

這是一個演示

您可以使用std::is_same<T2, char>進行分支,例如if (std::is_same<T2, char>::value) ,或者您可以使用標簽調度,如下所示:

public:
    void foo(T1 t1, T2 t2) {
        foo_impl(t1, t2, std::is_same<T2, char>{});
    }

private:
    void foo_impl(T1 t1, T2 t2, std::false_type) {
        std::cout << "T2 != char\n";
    }

    void foo_impl(T1 t1, T2 t2, std::true_type) {
        std::cout << "T2 == char\n";
    }

演示

暫無
暫無

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

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