[英]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.