c++ 检查两个模板参数包是否相同

epfja78i  于 2023-05-08  发布在  其他
关注(0)|答案(2)|浏览(119)

我有一个类模板,它有一个参数包,这个类模板有一个成员函数模板,它也有一个参数包。现在,在成员函数模板中,我需要知道两个模板参数包是否相同(这意味着它们具有相同的长度,并且它们对应的所有元素都相同)。

template<typename... T>
struct C
{
    template<typename... U>
    void f()
    {
        //how can I know here if the two template packs are same(meaning of same length as well as have same elements in the same order)
        bool result = /*what to write here?*/
        std::cout << "T... and U... are: " << (result? "same":"not same")<<"\n";
    }
};
int main()
{
    C<int, int, int, int> c;
    c.f<int,int, int, int>(); // same

    c.f<int, int, int>();     //not same
   
    c.f<int, int, int, double>(); //not same

    c.f<int, double>();           //not same
}

正如你所看到的,我不知道bool result = ?;的右边应该是什么。也许可以创造一个特质来做。

zlhcx6iw

zlhcx6iw1#

下面显示了使用fold expressionsSFINAE执行此操作的一种方法:

template<typename... T> struct Helper{};
template <typename... T, typename...U> 
std::enable_if_t<sizeof...(T)==sizeof...(U), bool> is_all_same(Helper<T...>, Helper<U...>) 
{
    return (... && std::is_same_v<Helper<T>,Helper<U>>); 
    
}; 
template <typename... T, typename...U> 
std::enable_if_t<!(sizeof...(T)==sizeof...(U)), bool> is_all_same(Helper<T...>, Helper<U...>) 
{
    return false;
}

然后你可以写:

bool result = is_all_same(Helper<T...>{}, Helper<U...>{});

Working demo

6rqinv9w

6rqinv9w2#

一个相对简单的方法是定义一个包含所有类型的类型列表:

template<typename... T>
struct List {};

然后直接比较2 List s将为真,如果它们包含相同的类型:

bool result = std::is_same_v<List<T...>, List<U...>>;

这里有一个demo

相关问题