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<*>"> ... </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>
结果:
我正在尝试为部分专用类型创建 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>
结果: