[英]C++ Partial Template Specialization and Natvis
我正在嘗試為部分專業化類型創建 Visual Studio 調試可視化工具。 例如,假設我有這樣的事情:
template <typename T>
struct Foo
{
T bar;
};
template <typename T>
struct Foo<T*>
{
T baz;
};
如果沒有部分專業化,這將很容易:
<Type Name="Foo<*>"> ... </Type>
有了完全的專業化,這也很容易:
<Type Name="Foo<int>"> ... </Type>
但是我如何涵蓋部分專業化? 這甚至被支持嗎? 如果沒有,是否有解決方法?
簡短回答 - 不。您不能在 natvis 類型名稱<Type Name="Foo<*>">
中指定類型限定符、引用等。
但:
您可以將模板的 typename 參數用作字符串並與類型進行比較。 例如,在節點的Condition
屬性中:
<Type Name="Foo<*>">
<DisplayString Condition="strcmp("$T1","short")==0">specialization short</DisplayString>
<DisplayString Condition="strcmp("$T1","int &")==0">specialization int &</DisplayString>
<DisplayString>unspecified specialization</DisplayString>
</Type>
對於Foo<short>
,您將看到其他的specialization short
和unspecified specialization
。
例子:
template <typename T, typename U>
struct Foo
{
T bar;
};
template <typename U>
struct Foo<int &, U>
{
U baz;
};
int main()
{
int gg = 0;
Foo<short, int> a;
Foo<int, int> b;
Foo<int &, int> c;
納特維斯:
<Type Name="Foo<*,*>" >
<DisplayString Condition="strcmp("$T1","short")==0">specialization short</DisplayString>
<DisplayString>unspecified specialization</DisplayString>
</Type>
<Type Name="Foo<int&,*>">
<DisplayString>partial specialization int&</DisplayString>
</Type>
結果:
或者,如果您的部分專業類型中有一些獨特的成員,則可以使用Priority
選項。
例子:
template <typename T>
struct Foo
{
T bar;
};
template <typename U>
struct Foo<U &>
{
U baz;
};
int main()
{
int g = 0;
Foo<short> a;
Foo<int> b;
Foo<int &> c{g};
納特維斯:
<Type Name="Foo<*>">
<DisplayString>partial specialization {baz}</DisplayString>
</Type>
<Type Name="Foo<*>" Priority="Low">
<DisplayString>other specialization</DisplayString>
</Type>
結果:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.