首页 > 解决方案 > 如何检查一个类是否具有特定功能以避免编译时问题?

问题描述

我有两个 A 类和 B 类,有一个共同的函数对它们进行一些操作,但差别很小。

我尝试使用std::is_same,但看起来它不会阻止编译时问题。

class A {
public: 
    void aSpecificFunctionToA() {
    }
};

class B {
};


template<typename T>
void someFunction(T obj) {
    if(std::is_same<T, A>::value)
    {
        obj.aSpecificFunctionToA();
    }
}

如何应对这种情况?

标签: c++c++11templatescompiler-errors

解决方案


如果您可以使用 c++17,那么您可以使用if constexpr它来有条件地编译满足某些约束的代码。

template<typename T>
void someFunction(T obj) {
    if constexpr (std::is_same<T, A>::value)
    {
        obj.aSpecificFunctionToA();
    }
    // ... code for all Ts
}

在c++17之前,可以使用for的重载A,将所有Ts共有的代码放到单独的函数中:

template<typename T>
void common_code(T obj) {
  // ... code for all Ts
}

template<typename T>
void someFunction(T obj) {
  common_code(obj);
}

void someFunction(A obj) {
  obj.aSpecificFunctionToA();
  common_code(obj);
}

推荐阅读