测试两个模板是否相同,即使非类型参数包作为参数也是如此

Seb*_*n.M 8 c++ templates

所以我需要找出两个模板是否相同,即使参数不是,即.如果in T<A>U<B>T和U相同,即使A和B不相同.std::is_same不能使用,因为它只考虑完整类型.

我的第一个解决方案是:

template<typename T, typename U>
struct is_same_template : std::false_type {};

template<template<typename> typename T, typename A, typename B>
struct is_same_template<T<A>, T<B>> : std::true_type {};

template<template<typename> typename T, typename A, template<typename> typename U, typename B>
struct is_same_template<T<A>, U<B>> : std::false_type {};
Run Code Online (Sandbox Code Playgroud)

它有效,但仅适用于带有一个参数的模板,因此我将其扩展为:

template<typename T, typename U>
struct is_same_template : std::false_type {};

template<template<typename...> typename T, typename... A, typename... B>
struct is_same_template<T<A...>, T<B...>> : std::true_type {};

template<template<typename...> typename T, typename... A, template<typename...> typename U, typename... B>
struct is_same_template<T<A...>, U<B...>> : std::false_type {};
Run Code Online (Sandbox Code Playgroud)

即使对于带有参数包的模板,这也很有效.
例:

template <typename... Params>
struct Test1 {};

template <typename... Params>
struct Test2 {};

struct Foo {};
struct Bar {};

int main(int argc, char** argv) {    
    std::cout << std::boolalpha;
    std::cout << is_same_template<Test1<Foo>, Test2<Foo>>::value << '\n';
    std::cout << is_same_template<Test1<Foo>, Test2<Bar>>::value << '\n';
    std::cout << is_same_template<Test1<Foo, Bar>, Test2<Bar>>::value << '\n';

    std::cout << is_same_template<Test1<Foo>, Test1<Foo>>::value << '\n';
    std::cout << is_same_template<Test1<Foo>, Test1<Bar>>::value << '\n';
    std::cout << is_same_template<Test1<Foo, Bar>, Test1<Bar>>::value << '\n';

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出:

false
false
false
true
true
true
Run Code Online (Sandbox Code Playgroud)

我的问题是,在实际用例中,我为template参数做了一个int参数包:

template <int... Indexes>
struct ArgIndexes {};
Run Code Online (Sandbox Code Playgroud)

我不知道类型和非类型的处理方式不同.使用ArgIndexes结果进行测试时始终是值

template<typename T, typename U>
struct is_same_template : std::false_type {};
Run Code Online (Sandbox Code Playgroud)

有没有办法让它与类型和非类型参数包一起使用而不专门处理每种类型的非类型参数包?

编辑

我才意识到这一点

template<template<typename...> typename T, typename... A, template<typename...> typename U, typename... B>
struct is_same_template<T<A...>, U<B...>> : std::false_type {};
Run Code Online (Sandbox Code Playgroud)

是多余的,可以删除.

Seb*_*n.M 2

所以汽车可以工作。我所有的测试都适用于这种组合:

template<typename T, typename U>
struct is_same_template : std::false_type {};

template<template<typename...> typename T, typename... A, typename... B>
struct is_same_template<T<A...>, T<B...>> : std::true_type {};

template<template<auto...> typename T, auto... A, auto... B>
struct is_same_template<T<A...>, T<B...>> : std::true_type {};
Run Code Online (Sandbox Code Playgroud)

我之前没有测试 auto,因为集成到我的 IDE 中的 Clang 告诉我不允许使用 auto。嗯,确实如此,而且有效。感谢@Jarod42 让我重新考虑它。

  • 尝试使用“std::array”。 (2认同)