首页 > 解决方案 > 自动扩展宏

问题描述

我尝试扩展我对宏及其用法的了解。

我遇到了一个特定的问题。

这是我的情况

这是我的问题

我计划创建适应给定情况的宏。

这是我想解决的场景

对于这种情况,你们有什么解决方案、提示或指导。

标签: c++

解决方案


前两个你可以很容易地通过一个专门用于指针(via if constexpr)的模板来获得,第三个是另一个只接受模板参数的重载:

#include <string>
#include <iostream>

template <typename T>
auto type_of(const T& t){
    if constexpr (std::is_pointer_v<T>) {
        return std::string{"a pointer \n"};
    }
    else { 
        return std::string{"not a pointer \n"};
    }
}

template <typename T>
auto type_of() {
    return std::string{"type_of without parameter \n"};
}


int main()
{
    int x;
    std::cout << type_of(x);
    std::cout << type_of(&x);
    std::cout << type_of<int>();
    return 0;
}

输出:

not a pointer 
a pointer 
type_of without parameter 

我建议您不要为此使用宏。它们在自动代码生成中占有一席之地,但使用它们来节省一些输入通常会导致代码难以阅读、维护和调试,而其他 C++ 特性可以轻松地替换它们而没有所有这些缺点。此外,宏在代码编译之前被扩展,即预处理器不知道类型、指针或变量。宏只是关于替换令牌。


推荐阅读