c++ - 使用类名称进行条件宏扩展

标签 c++ c++11

我有一个函数 A ,其代码会根据输入是struct B 还是struct C 而改变。我不想两次写,所以我将差异封装在结构的()运算符中。

我的问题是 处理大量数据,并且()运算符被广泛调用。我想用宏替换该部分,以提高代码的性能。像这样:

#define B_TASK(data) //macro for B's task
#define C_TASK(data) //macro for C's task

struct B();
struct C();

template<class struct_t>
function A(struct_t data){
     //some irrelevant code
     .
     .
     while(..){ //extensive loop
         #if data == B //my original code uses data()
            B_TASK(data)
         #else
            C_TASK(data)
         #endif
     }
}

int main(){
    B b_inst;
    C c_inst;

    A<B>(b_inst);
    A<C>(c_inst);
}

可以做这样的事情吗?我不知道如何在预处理器#if中要求结构名称。

最佳答案

如果C++ 17的constexpr if std::is_same 类型特征是可能的。看起来像

template<class struct_t>
function A(struct_t data){
     //some irrelevant code
     while(...){ //extensive loop
         if constexpr(std::is_same_v<struct_t, B>)
            B_TASK(data)
         if constexpr(std::is_same_v<struct_t, C>)
            C_TASK(data)
     }
}

关于c++ - 使用类名称进行条件宏扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60191751/

相关文章:

c++ - 组合接口(interface)类

c++ - 为什么 Visual Studio 显示多线程,即使我的 MFC 应用程序不是多线程的?

c++11 - 链接错误 : multiple definition of static variable

c++ - 我无法通过 C++ 中的函数式编程重现函数内存

c++ - 重载 << 就像 cout 错误

c++ - 出于对象替换的目的,对象的 "name"究竟是由什么构成的?

c++ - 访问 getter 的真正底层类型?

c++ - 在文件范围内声明互斥锁安全吗?

c++ - 尝试使用 std::vector<std::thread> 时出现静态断言失败错误

c++ - 为什么在使用 .replace 运算符时字符串的长度不超过 16 个字符?