首页 > 解决方案 > 在编译期间检查模板类型参数以进行特定于类型的操作

问题描述

首先,代码仅限于 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,但每次都得到相同的编译时错误。

  1. 我无法使用 C++14/C++17
  2. 我怎样才能使用专门的模板功能?

编辑代码以突出显示模板的需要。

标签: c++c++11templates

解决方案


您可以使用函数重载并完全避免使用函数模板。

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.
}


推荐阅读