c++ - 如何检查一个对象是否是多个模板参数的模板类的实例,并且其中一个参数满足某些条件?

https://stackoverflow.com/questions/72279095/how-to-check-if-an-object-is-an-instance-of-a-template-class-of-multiple-templat/72279177#72279177我得到了以下特征来检查一个类型是否是几个模板化类型的特定模板实例化模板参数:

template <typename T1, typename T2>
struct A
{
};

template <typename Type>
struct IsA: std::false_type
{
};

template <typename T1, typename T2>
struct IsA<A<T1, T2>> : std::true_type
{
};

如何另外添加第二种类型 T2 满足其他条件的条件?我试着做

template <typename Type>
struct IsA: std::false_type
{
};

template <typename T1, typename T2, std::enable_if_t<SomeCondition<T2>::value>>
struct IsA<A<T1, T2>> : std::true_type
{
};

但我得到了错误

error: template parameters not deducible in partial specialization:

回答1

你走在正确的轨道上:

#include <type_traits>
#include <iostream>

template <typename T1, typename T2>
struct A
{
};

template <typename Type, typename=void>
struct IsA: std::false_type
{
};

template <typename T1, typename T2>
struct IsA<A<T1, T2>, std::enable_if_t<std::is_same_v<T2, int>>>
    : std::true_type
{
};

int main()
{
    std::cout << IsA<int>::value << "\n";

    std::cout << IsA<A<char, char>>::value << "\n";

    std::cout << IsA<A<char, int>>::value << "\n";
    return 0;
}

在这个简单的例子中,“某些条件”只是一个 std::is_same_v<T2, int>,只是为了举例。

相似文章

basex - Basex 上的 Xquery 练习问题

在BaseX中的查询我真的需要你的帮助。问题是我真的不明白Xquery这种语言背后的逻辑。所以我有第一个练习,它在问我:“查找2012年6月5日之后出现的第一个症状。在包含SYM元素的根SYMSAFT...

最新文章