c++ - 在编译期间检查模板类型参数以进行特定于类型的操作
问题描述
首先,代码仅限于 C++11,所以我不能使用if constexpr
以下是我的示例代码片段:
class A{
public:
int a;
int b;
}
class B{
public:
int key;
int val;
}
class C{
public:
int n1;
int n2;
}
class D{
public:
int n1;
int n2;
}
class E{
public:
int n1;
int n2;
}
template<typename T>
void func1(T data) {
if (T == type(A)) { // Just pseudo template-check code
std::cout<<data.a<<data.b; //<------1
} else if (T == type (B)) { // Just pseudo template-check code
std::cout<<data.key<<data.val; //<------2
} else {
std::cout<<data.n1<<data.n2; //<------3
}
int main() {
A a;
B b;
C c;
D d;
E e;
func1(a);
func1(b);
func1(c);
func1(d);
func1(e);
return 0;
}
目前,我收到一个编译时错误,
1: B,D,E,F has no member a & b
&
2: A,D,E,F has no member key & val
&
3. A, B has no member n1 & n2
我尝试使用is_same()和this,但每次都得到相同的编译时错误。
- 我无法使用 C++14/C++17
- 我怎样才能使用专门的模板功能?
编辑代码以突出显示模板的需要。
解决方案
您可以使用函数重载并完全避免使用函数模板。
void func1(A a)
{
// Type dependent code.
}
void func1(B a)
{
// Type dependent code.
}
只有当函数调用所针对的所有类型都有公共代码时,函数模板才有意义。如果您有一些对所有类型都通用的代码和一些依赖于类型的代码,那么您可以使用:
void func1(A a)
{
// Type dependent code.
}
void func1(B a)
{
// Type dependent code.
}
template <typename T>
void func2(T t)
{
// Type independent code.
}
template <typename T>
void func(T obj)
{
func1(obj); // Call function that uses type dependent code.
func2(obj); // Call function that uses type independent code.
}
推荐阅读
- django - 在Django中保持一对多关系的顺序
- c# - 我需要一个使用 TikaOnDotNet 从 SqlLite3 数据库中提取信息的示例,你有吗?
- android - 在 Firebase DB 中侦听同一层次结构级别的属性
- java - 在 Java 中读写整数的有效方法
- php - 创建文件和修改日期的多维数组
- swift - 当它在 {} 而不是 [] 中时,我如何从 api 中获取东西
- xslt - 在 XSLT 中,是否可以在具有 ID 的子代之前插入一个元素?
- c++ - 类 Python || 和 && 用于 C++ 中的 if
- java - 如何从文件中获取数据并替换数独游戏中的预定义数组
- javascript - 使用 Function.prototype.apply 时如何键入函数调用