c++ - 如何检查一个类是否具有特定功能以避免编译时问题?

标签 c++ c++11 templates compiler-errors

我有两个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++ 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之前,您可以对A使用重载,并将所有T通用的代码放入单独的函数中:
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);
}

关于c++ - 如何检查一个类是否具有特定功能以避免编译时问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63775125/

相关文章:

c++ - 从 vector 中排序和提取元素

c++ - 如何检查字符串中是否存在除 '-' ,'_' ,'.' , C++ 中的 '@' 之外的任何 SYMBOL?

c++ - 如何用成员函数初始化 `std::function`?

c++ - 无限数组 C++ 在一个表达式中使用两个新值调整数组大小

c++ - 在 Bazel 中包含 Protobufs

C++:对象 vector 与指向新对象的指针 vector ?

c++ - 为什么这里的枚举变量是右值?

c++ - 我可以在不指定数字分布的情况下使用随机生成器吗?

c++ - 位摆弄 : find next power of two with templates in c++

c++ - 使用 clang 编译 std::tuple 时遇到问题