我想检查两种类型是否相同,但不管它们的模板参数如何。像这样:
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
轻松完成,但现在,我遇到了问题......
编辑: 我可以手动排除A为几个常见的Ts,使用,我正在寻找一种方法来为所有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>");
答案 0 :(得分:4)
好的,这个怎么样:
#include <iostream>
template<class T>
struct A {};
struct B {};
template <typename T>
struct should_reject { static constexpr bool value = false; };
template <typename T>
struct should_reject<A<T>> { static constexpr bool value = true; };
template <typename T>
void rejectA(T t)
{
std::cout << should_reject<T>::value << std::endl;
}
int main() {
rejectA(B()); // false
rejectA(1); // false
rejectA(1.0); // false
rejectA(A<B>()); // true
rejectA(A<int>()); // true
rejectA(A<double>()); // true
}
答案 1 :(得分:3)
我提出了一种比@ NikitaKakuev的答案更简单的方法,目前用于project of mine。
template<typename, typename>
constexpr bool is_same_template{false};
template<
template<typename...> class T, //typename T in C++17
typename... A,
typename... B
>
constexpr bool is_same_template<
T<A...>,
T<B...>
>{true};
目前唯一的问题是混合类型和类型名称的模板,即。 std::array<int, 10>
。
为克服这一限制,需要专业化。
用法:
bool b = is_same_template<std::string, std::wstring>; //true
//both are typedefs of std::basic_string
编辑:根据@Helix在下面的评论中的要求,std::array
(或具有相同签名的任何其他模板)的专业化:
template<
template<typename, std::size_t> class T, //typename T in C++17
typename TA, std::size_t NA,
typename TB, std::size_t NB
>
constexpr bool is_same_template<
T<TA, NA>,
T<TB, NB>
>{true};