C++模板 获得两个模板是否相同,模板的最小大小,某个实现是否来源于某个模板

本文探讨了C++中如何判断两个模板是否相同以及获取模板的最小大小。提到在某些情况下,using重命名的模板在编译器眼中并非完全等价,这给模板相同性的检查带来了挑战。同时,由于模板的特性,可能存在两个不同的模板被误判为相同的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

只处理存放类型的模板

附:对于编译器而言,using 重命名模板和原模板在实例化以前属于两个模板,不能简单使用std::is_same的逻辑来处理两个模板是否相同的问题。但是当前的实现依然是有一定问题的,通过模板分配可以让两个不同的模板判定为相同,我也没什么办法。

#ifndef TEMPLATE_PROCESSING_H
#define TEMPLATE_PROCESSING_H

#include <cstddef>
#include <type_traits>

template<typename Type>
struct template_exploser;

template<template<typename...>class Template, typename ...Args>
struct template_exploser<Template<Args...>>
{
    template<typename...NewArgs>
    using type = Template<NewArgs...>;
    template<template<typename...>class NewTemplate>
    using apply = NewTemplate<Args...>;

    static constexpr size_t size = sizeof... (Args);
};

template <typename Type, template <typename ...> class Template>
struct is_instance_of
{
private:
    template<typename ...CheckType>
    static void check (Template<CheckType...>);
    template<typename ...CheckType>
    static bool check (...);
public:
    static constexpr bool value = std::is_void<decltype (check (std::declval<Type>())) >::value;
};

template<size_t i, typename FillType = void>
struct template_filler
{
    template<template<typename...>class Template, typename ...Args>
    using apply = typename template_filler < i - 1 >::template apply<Template, Args..., FillType>;
};

template<>
struct template_filler<0>
{
    template<template<typename...>class Template, typename ...Args>
    using apply = Template<Args...>;
};

template<template<typename...>class Template, size_t i = 0
         , typename = void
         >
struct template_size
{
    static constexpr size_t value = template_size < Template, i + 1 >::value;
    using type = typename template_size < Template, i + 1 >::type;
};
template<template<typename...>class Template, size_t i>
struct template_size<Template, i, std::void_t<typename template_filler<i>::template apply<Template>>>
{
    using type = typename template_filler<i>::template apply<Template>;
    static constexpr size_t value = template_exploser<type>::size;
};

template<template<typename...>class TemplateFirst, template<typename...>class TemplateSecond>
struct is_same_template
{
private:
    template<template<typename...>class TemplateCheck>
    static void check (typename template_size<TemplateCheck>::type*);
    template<template<typename...>class TemplateCheck>
    static bool check (...);
public:
    static constexpr bool value = std::is_void <
                                  decltype (check<TemplateFirst> (static_cast<typename template_size<TemplateSecond>::type*> (nullptr)))
                                  >::value;
};

#endif

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值