簡體   English   中英

static_if是否會棄用模板專精?

[英]Will static_if deprecate template specialization?

一些通常的模板專業化如下:

template<class T>
class C
{
    void common() { ... }
    void f2 = delete;
};

template<>
class C<int>
{
    void common() { ... }
    void f1() { ... }
};

可以用static_if表示為:

template<class T>
class C
{
    void common() { ... }

    static_if(std::is_same<T, int>::value)
    {
        void f1( ) { ... }
    }
    else
    {
        void f2( ) = delete;
    }
}

這些是直接競爭的功能嗎? 模板專業化可以做一些static_if不可以嗎? 似乎static_if可以完成模板專業化所能做的一切,還有更多。

static_if且不說:我在這種情況下並不喜歡static_if ,因為它可能使得在任何特定情況下接口的哪些部分都可用。 在某些情況下,模板特化仍然可以提供更清晰的語法。

static if不能為您做static if一件事是使用模板特化的“主要”方式 - 在一個地方提供通用行為,並讓代碼的用戶 覆蓋 (=專門化)它的特定需求/數據類型/等等...

不,static_if不會棄用顯式模板特化。 顯式模板特化是一個比static_if更強大的功能,它提供了許多靜態函數不具備的功能。 static_if只是表達某些東西的一種更方便和可讀的方式。

static_if不能做某些事情,顯式模板特化可以,比如改變一個類繼承的基類。

struct S {};

template<typename T>
struct T
  static_if(is_same<T,int>::value) { : S }  // ?
{ };

template<typename T>
struct T {};

template<>
struct T<int> : S {};

如果是關於分支; 專業化是關於匹配。 有時一個比另一個好。

這是一個直接來自Alexandrescu的Modern C ++ Design ,第11.9節“Multimethods”的例子:假設你有一個基於Shape的復雜類層次結構,具有虛擬和非虛擬繼承。 您希望能夠盡可能高效地在層次結構的成員之間進行投射。 由於虛擬基礎需要dynamic_cast ,我們必須允許,但我們也希望盡可能使用static_cast 通過演員表政策解決:

template <typename To, typename From> struct ShapeCaster
{ 
    static To & cast(From & x) { return dynamic_cast<To&>(x); }
};

template <> struct ShapeCaster<Triangle, Shape>
{
    static Triangle & cast(Shape & x) { return static_cast<Triangle&>(x); }
};

template <typename To, typename From> To & shape_cast(From & x)
{
    return ShapeCaster<To, From>::cast(x);
}

現在,無論你在層次結構中移動,你都可以說

To & y = shape_cast<To>::cast(x);

並且您獲得了最有效的演員陣容,並且可以輕松擴展該政策。

用一系列if寫這個是很難讀的。

static if功能甚至尚未成為標准。 現在,假設相關問題已經解決並且使其成為標准,並且所有編譯器都支持它,那么它將只是工具集中的一個工具。

我可以想象不同的情況,專業化會使代碼更易讀/可維護,在所有這些情況下,專業化仍然是可行的方法。 需要注意的是最大的優勢static if是,你可以交織來自不同專業的代碼,但也可能是一個缺點,而不是作為具有多特簡單,你可能最終得到的代碼一個巨大的BLOB是被編譯/有條件地忽略。

我相信是的。 static_if比模板static_if更強大,特別是在你需要專門化一小部分類而不是整個定義的情況下。 專業化更好的唯一情況 - 當您的專業實現與主要模板/其他專業化完全不同時。

沒有采取到帳戶的喜好, 唯一且當它可以使用另一種模板特殊化!

眾所周知: std::is_same<T, int>::value是一個模板專門化本身!

我不確定,但我認為它實現如下:

template<typename, typename>
struct is_same{
    static constexpr bool value = false;;
};
 template<typename T>
struct is_same<T, T>{
    static constexpr bool value = true;;
};

真正的問題是,最終是否會有一種沒有模板專業化的類型/類比較方法? 也許只有這樣才不需要模板專業化!

暫無
暫無

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

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