gpt4 book ai didi

c++ - std::is_same 等同于非专用模板类型

转载 作者:太空狗 更新时间:2023-10-29 20:22:17 24 4
gpt4 key购买 nike

在一个项目中,我发现了一种保持 DRY 的可能性,因为除了一些小部分之外,对于模板的模板特化,很多代码可以保持不变。这是我目前正在做的一个小工作示例,用于检查我使用的是哪个模板类:

template<typename T>
class A{};

template<typename T>
class B{};

template<template<class> class C>
void do_stuff()
{
if(std::is_same<A<int>,C<int>>::value)
{
// Do Stuff for A
} else if(std::is_same<B<int>,C<int>>::value)
// Do Stuff for B
}
}

int main()
{
do_stuff<A>();
}

我想做的是使用

std::is_same<A,C>::value

判断模板类型。是否有任何功能可以帮助我,或者我是否缺少在这种情况下可以更好地工作的模式?

我知道我可以做类似的事情

template<template<class> class C, typename T>
void do_stuff();

do_stuff<A,T>();

但这对我来说似乎是错误的做法。

最佳答案

你可以写一个 is_same_template当两个模板模板参数相同时部分特化的特征:

template <template <typename...> class, template<typename...> class> 
struct is_same_template : std::false_type{};

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

然后你可以写is_same_template<A,C>::value .

请注意,这不适用于具有非类型模板参数的模板,例如 std::array .

一些编译器不会将别名模板视为等同于它作为别名的模板,因此以下将导致 std::false_type :

template <typename T, typename Alloc>
using MyVec = std::vector<T, Alloc>;

is_same_template<std::vector, MyVec>;

这被认为是 defect in the standard ,但在所有常见编译器中实现此修复之前,您不应依赖行为。


也就是说,你需要小心你在那些 if 中输入的内容分支,因为无论模板是用什么实例化的,代码都需要编译。在 C++17 中,您将能够使用 if constexpr解决这个问题,但现在你需要标记 dispatch 或有不同的特化,如果分支有代码只对 A 有效或 B .

template <template <typename...> class> struct tag{};

template <template <typename> class T>
void do_stuff() {
do_stuff(tag<T>{});
}

void do_stuff(tag<A>) {
std::cout << "A";
}

void do_stuff(tag<B>) {
std::cout << "B";
}

关于c++ - std::is_same 等同于非专用模板类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38630445/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com