gpt4 book ai didi

c++ - 使用 std::is_same 进行元编程

转载 作者:可可西里 更新时间:2023-11-01 15:38:28 31 4
gpt4 key购买 nike

是否可以像下面那样在没有模板特化的情况下进行编译?

template <class T> 
class A {
public:
#if std::is_same<T,int>
void has_int() {}
#elif std::is_same<T,char>
void has_char() {}
#endif
};
A<int> a; a.has_int();
A<char> b; b.has_char();

最佳答案

是的。制作功能模板,然后使用 std::enable_if 有条件地启用它们:

#include <type_traits>

template <class T>
class A {
public:

template<typename U = T>
typename std::enable_if<std::is_same<U,int>::value>::type
has_int() {}

template<typename U = T>
typename std::enable_if<std::is_same<U,char>::value>::type
has_char() {}
};

int main()
{
A<int> a;
a.has_int(); // OK
// a.has_char(); // error
}

解决方案来自 the other answer如果类很大并且有许多需要的功能而不考虑 T,则可能不可行。但是您可以通过继承另一个仅用于这些特殊方法的类来解决这个问题。然后,您可以仅特化该基类。

在 C++14 中,有方便的类型别名,所以语法可以变成:

std::enable_if_t<std::is_same<U, int>::value>

和 C++17,甚至更短:

std::enable_if_t<std::is_same_v<U, int>>

关于c++ - 使用 std::is_same 进行元编程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27504280/

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