【发布时间】:2016-01-24 06:01:23
【问题描述】:
我想检查两种类型是否相同,但不管它们的模板参数如何。像这样的:
template<class T>
class A {};
class B {};
int main() {
cout << std::is_same_template<A<int>, A<string>>::value << endl; // true
cout << std::is_same_template<A<int>, B>::value << endl; // false
}
我知道std::is_same 用于检查两种类型是否完全匹配。
我需要这个的原因:
我有一个可以使用任何类型调用的模板化方法,但我想禁止使用A(模板化)类型调用它,可能使用static_assert。如果A 没有模板化,我相信使用std::is_same 可以轻松完成,但是现在,我有一个问题......
编辑: 我可以为一些常见的 T 手动排除 A,使用,我正在寻找一种方法来为所有 T 执行此操作:
static_assert(!std::is_same<parameter_type, A<int>>::value, "Cannot use this function with type A<T>");
static_assert(!std::is_same<parameter_type, A<double>>::value, "Cannot use this function with type A<T>");
static_assert(!std::is_same<parameter_type, A<bool>>::value, "Cannot use this function with type A<T>");
【问题讨论】:
-
两种类型不一样,如果它们的模板参数不同的话。因此,
A<int>和A<float>远不是同一种类型。 -
嗯,我很清楚这一点,这就是为什么我不能使用
std::is_same。我要问的是,如果有办法不那么严格地比较,让 A和 A 比较相等,而 A 和 B 不比较? -
您可以通过模板特化的方式使用相反的方法,因此只接受允许的类并定义一个空/损坏/抛出/其他函数。
-
我自己也想到了这一点,但这并不是真正的最佳选择,因为我希望我的函数可用于任何类型,除了这个。这需要我写很多专业化:) 因为我可以禁止固定类型,所以我宁愿禁止 A
用于一些常见的 T。 -
你不能重构
A以便有一个模板化的组件/委托,这样你就可以设法将is_same与A一起使用吗?