检查两种类型是否属于同一模板

问题描述 投票:2回答:3

我想检查两种类型是否属于同一模板。作为一个例子,我希望以下代码片段返回true,因为尽管内部元素具有不同类型,但两个对象都是向量。

检查是在编译时进行的(这就是函数constexpr的原因)。

#include <iostream>
#include <type_traits>
#include <vector>

template <typename Container1, typename Container2> constexpr bool CheckTypes(Container1 c1, Container2 c2)
{
    return std::is_same<Container1,Container2>::value;
}

int main()
{
  std::vector<int> v1(100,0);
  std::vector<double> v2(100,0);
  std::cout << CheckTypes(v1,v2);
}
c++ sfinae typetraits
3个回答
2
投票

干得好:

template <class T, class U>
struct are_same_template : std::is_same<T, U>
{};

template <template<class...> class T, class T1, class T2>
struct are_same_template<T<T1>, T<T2>> : std::true_type
{};

template <class T, class U>
constexpr bool CheckTypes(T, U)
{
    return are_same_template<T, U>::value;
}

但是:ぁzxswい


这通过提供丢弃模板参数类型的http://coliru.stacked-crooked.com/a/8533c694968f4dbb的特化来工作:

are_same_template

即使template <template<class...> class T, class T1, class T2> struct are_same_template<T<T1>, T<T2>> T1不同(模板参数类型),T2也是一个真正的类型:

are_same_template

关于are_same_template<T<T1>, T<T2>> : std::true_type 而不是template<class...>:这是为了容纳事实,而template<class>容器有隐含的模板参数。感谢ConstantinosGlynos让我意识到这一点。


0
投票

检查这个std::。它们提供了一种检查某些东西是否是模板类的特化的方法:

post

并可能做这样的事情来保持你的原始界面:

template<typename Test, template<typename...> class Ref>
struct is_specialization : std::false_type {};

template<template<typename...> class Ref, typename... Args>
struct is_specialization<Ref<Args...>, Ref>: std::true_type {};

所以你可以这样做:

template <typename Container1, typename Container2> 
constexpr bool CheckTypes(Container1 c1, Container2 c2) {
    return is_specialization<Container1, std::vector>::value && is_specialization<Container2, std::vector>::value;
}


0
投票

你可以但需要一点metaprog:

int main() {
    std::vector<int> v1(100,0);
    std::vector<double> v2(100,0);
    std::cout << CheckTypes(v1,v2);
    return 0;
}

跑:#include <iostream> #include <type_traits> #include <vector> #include <set> template <typename Container1, typename Container2> struct CheckTypes_impl { constexpr static bool check (Container1 , Container2 ) { return false; } }; template < template <class...> class Container1, class... args1 , class... args2 > struct CheckTypes_impl<Container1<args1...>,Container1<args2...>> { constexpr static bool check (Container1<args1...> , Container1<args2...> ) { return true; } }; template < template <class...> class Container1, class ... args1, template <class...> class Container2, class ... args2 > constexpr bool CheckTypes(Container1<args1...> c1, Container2<args2...> c2) { return CheckTypes_impl<Container1<args1...>,Container2<args2...>>::check(c1,c2); } int main() { std::vector<int> v1(100,0); std::vector<double> v2(100,0); std::set<int> s; std::cout << CheckTypes(v1,v2) << std::endl; std::cout << CheckTypes(v1,s) << std::endl; }

更新:你需要“模板类Container1,类......”因为vector不带1个模板参数,但是2.在一般情况下你不知道将使用多少个默认参数

© www.soinside.com 2019 - 2024. All rights reserved.