簡體   English   中英

C++ 部分模板專業化和 Natvis

[英]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&lt;*&gt;"> ... </Type>

有了完全的專業化,這也很容易:

<Type Name="Foo&lt;int&gt;"> ... </Type>

但是我如何涵蓋部分專業化? 這甚至被支持嗎? 如果沒有,是否有解決方法?

簡短回答 - 不。您不能在 natvis 類型名稱<Type Name="Foo&lt;*&gt;">中指定類型限定符、引用等。

但:

您可以將模板的 typename 參數用作字符串並與類型進行比較。 例如,在節點的Condition屬性中:

<Type Name="Foo&lt;*&gt;">
  <DisplayString Condition="strcmp(&quot;$T1&quot;,&quot;short&quot;)==0">specialization short</DisplayString>
  <DisplayString Condition="strcmp(&quot;$T1&quot;,&quot;int &amp;&quot;)==0">specialization int &amp;</DisplayString>
  <DisplayString>unspecified specialization</DisplayString>
</Type>

對於Foo<short> ,您將看到其他的specialization shortunspecified 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&lt;*,*&gt;" >
  <DisplayString Condition="strcmp(&quot;$T1&quot;,&quot;short&quot;)==0">specialization short</DisplayString>
  <DisplayString>unspecified specialization</DisplayString>
</Type>

<Type Name="Foo&lt;int&amp;,*&gt;">
  <DisplayString>partial specialization int&amp;</DisplayString>
</Type>

結果:

strcmp

或者,如果您的部分專業類型中有一些獨特的成員,則可以使用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&lt;*&gt;">
  <DisplayString>partial specialization {baz}</DisplayString>
</Type>

<Type Name="Foo&lt;*&gt;" Priority="Low">
  <DisplayString>other specialization</DisplayString>
</Type>

結果:

優先

暫無
暫無

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

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