Ton*_*ony 5 c++ templates types type-traits
template<class T>
class A
{};
Run Code Online (Sandbox Code Playgroud)
我需要类似于std::is_same
或std::is_base
应该对于例如std::xxxx<double, A<double>>::value
(因为double是用作模板参数的类型)的东西,但std::xxxx<int, A<double>>::value
在编译时是假的.这该怎么做?
joe*_*hip 13
您可以执行以下操作:
#include <type_traits>
template<typename Type, typename Template>
struct is_template_param : std::false_type {};
template<typename Type, template<typename...> class Template, typename... R>
struct is_template_param<Type, Template<Type, R...>> : std::true_type {};
template<typename T>
struct TestStruct1 {};
template<typename T1, typename T2 = float>
struct TestStruct2 {};
static_assert(is_template_param<int, TestStruct1<int>>::value, "");
static_assert(!is_template_param<int, TestStruct2<double>>::value, "");
static_assert(is_template_param<int, std::vector<int>>::value, "");
Run Code Online (Sandbox Code Playgroud)
编辑:
这里是更通用的版本,它允许您检查类型是否是某个模板的第N个模板参数:
#include <type_traits>
#include <tuple>
template<std::size_t N, typename Type, typename Template>
struct is_nth_template_param : std::false_type {};
template<std::size_t N, typename Type, template<typename...> class Template, typename... TplParams>
struct is_nth_template_param<N, Type, Template<TplParams...>> : std::is_same<Type, std::tuple_element_t<N, std::tuple<TplParams...>>> {};
// is_template_param from the first version could be replaced with this:
template<typename Type, typename Template>
using is_1st_template_param = is_nth_template_param<0, Type, Template>;
Run Code Online (Sandbox Code Playgroud)
可以编写专用特征:
#include <type_traits>
template<typename T, typename TA> struct
has_parameter: public ::std::false_type
{};
template<typename T> struct
has_parameter<T, A<T>>: public ::std::true_type
{};
template<typename T, typename TA>
constexpr bool const has_parameter_v = has_parameter<T, TA>::value;
static_assert(has_parameter_v<double, A<double>>);
static_assert(!has_parameter_v<int, A<double>>);
Run Code Online (Sandbox Code Playgroud)
如果您能够修改您的课程,A
我会添加一个别名,您可以检查
template <class T>
class A
{
public:
using type = T;
};
Run Code Online (Sandbox Code Playgroud)
那么例如
int main()
{
std::cout << std::is_same<double, A<double>::type>::value << '\n';
std::cout << std::is_same<int, A<double>::type>::value;
}
Run Code Online (Sandbox Code Playgroud)
输出是
1
0
Run Code Online (Sandbox Code Playgroud)