[英]std::is_same equivalent for unspecialised template types
在一个项目中,我发现有可能将DRY保留为很多代码,除了一些小部件可以保持模板的模板特化相同。 这是一个小工作示例,我正在做的是检查我正在使用的模板化类:
template<typename T>
class A{};
template<typename T>
class B{};
template<template<class> class C>
void do_stuff()
{
if(std::is_same<A<int>,C<int>>::value)
{
// Do Stuff for A
} else if(std::is_same<B<int>,C<int>>::value)
// Do Stuff for B
}
}
int main()
{
do_stuff<A>();
}
我想做的是使用
std::is_same<A,C>::value
确定模板类型。 是否有任何功能可以帮助我,或者我错过了一种在这种情况下效果更好的模式?
我看到我可以做类似的事情
template<template<class> class C, typename T>
void do_stuff();
do_stuff<A,T>();
但这对我来说似乎是错误的做法。
您可以编写一个is_same_template
特征,该特征部分专用于两个模板模板参数相同时:
template <template <typename...> class, template<typename...> class>
struct is_same_template : std::false_type{};
template <template <typename...> class T>
struct is_same_template<T,T> : std::true_type{};
然后你可以编写is_same_template<A,C>::value
。
请注意,这对于具有非类型模板参数的模板(例如std::array
不起作用。
有些编译器不会认为别名模板等同于别名的模板,因此以下内容会导致std::false_type
:
template <typename T, typename Alloc>
using MyVec = std::vector<T, Alloc>;
is_same_template<std::vector, MyVec>;
这被认为是标准中的缺陷 ,但在所有常见编译器中实现此修复之前,不应依赖行为。
这就是说,你必须要小心你把这些东西if
分支机构,代码需要,无论什么模板与实例化的编译。 在C ++ 17中,你将能够使用if constexpr
来解决这个问题,但是现在你需要标记调度或者如果分支具有仅对A
或B
有效的代码则具有不同的特化。
template <template <typename...> class> struct tag{};
template <template <typename> class T>
void do_stuff() {
do_stuff(tag<T>{});
}
void do_stuff(tag<A>) {
std::cout << "A";
}
void do_stuff(tag<B>) {
std::cout << "B";
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.