g ++:存在哪些方法可以找出编译器选择了哪种模板专业化?
g++: which ways exist to find out which template specialization has been chosen by compiler?
如果您不确定编译器在特定情况下选择了哪种模板专业化 - 您知道如何找到哪些方法? (最好不改代码)
None 无需更改代码。
对于一个template class
,你可以轻松暴露一个public
enum {which=0};
在第一个专业化(包括基础)中,并在之后的每个专业化中递增 =0
。然后只需检查 Z<Args...>::which
,您就会知道选择了哪个。
对于模板函数,您大多不走运:但无论如何您真的不应该专门化模板函数(而是重载)。
如果未使用 return 值,您可以使用它执行类似的技巧 (std::integral_constant<int, 0>
)。如果函数使用仅限于一次使用,您可以更改每个特化以生成不同的错误(例如 static_assert(false, "specialization 0");
),这只会在特化被实例化时(在实践中)启动。
如果您不确定编译器在特定情况下选择了哪种模板专业化 - 您知道如何找到哪些方法? (最好不改代码)
None 无需更改代码。
对于一个template class
,你可以轻松暴露一个public
enum {which=0};
在第一个专业化(包括基础)中,并在之后的每个专业化中递增 =0
。然后只需检查 Z<Args...>::which
,您就会知道选择了哪个。
对于模板函数,您大多不走运:但无论如何您真的不应该专门化模板函数(而是重载)。
如果未使用 return 值,您可以使用它执行类似的技巧 (std::integral_constant<int, 0>
)。如果函数使用仅限于一次使用,您可以更改每个特化以生成不同的错误(例如 static_assert(false, "specialization 0");
),这只会在特化被实例化时(在实践中)启动。