c++ - 模板特化 'on the fly'

标签 c++ templates template-specialization

假设我有一个空的模板化结构 foo

template <typename T> struct foo {};

还有一个专门针对它的宏

#define SPECIALIZE(class_name) \
template <> \
struct foo<class_name> { \
    static const std::string value; \
}; \
const std::string foo<class_name>::value = #class_name;

我想要一个方法来打印它作为模板参数的类的名称。通常,我会这样做:

template <typename T>
void print() {
    std::cout << foo<T>::value << std::endl;
}

SPECIALIZE(std::vector<int>)
int main() {
    print<std::vector<int>>();
    return 0;
}

但是,我发现必须显式记录类非常烦人且容易出错,因为您必须确保宏被准确地调用一次。

我想做这样的事情:

template <typename T>
void print() {
    if (notdefined(foo<T>::value)) {
        SPECIALIZE(T)
    }
    std::cout << foo<T>::value << std::endl;
}

这当然是不可能的。

您知道我如何实现这一目标吗?

最佳答案

您想要做的是将模板参数设置为字符串。 不幸的是,这有两个问题

  1. 这被明确禁止“只是因为”
  2. 显然有一种在 C++11 中使用大量模板欺骗的解决方法

严重的问题实际上是2,因为这意味着C++可能永远不会在这个领域得到任何合理的东西(由于C++中的一些奇怪的原因,如果使用模板元编程存在一个极其复杂的半工作和逻辑上 splinter 的解决方案,那么就没有明智的解决方案将寻找)。

我的建议只是添加一个返回 const char * 的显式成员函数:

struct Protocol {
    virtual const char *name() const = 0;
};

struct TCP : Protocol {
    const char *name() const { return "TCP"; }
    ...
};

关于c++ - 模板特化 'on the fly',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43829511/

相关文章:

c++ - 函数模板参数推导

c++ - 关于工厂模式的问题

c++ - OpenGL 缓冲区对象内部工作原理?

c++ - 如果使用默认模板,如何产生编译器错误?

C++,从网站获取文本

C++ 外部模板实例化和 typedef (gcc)

html - perl 子程序输出附加 "1"

c++ - 类型特征 C++ 的错误/错误使用

c++ - 如何: derived member in derived class with derived class specific methods

c++ - 映射特定类型并保持所有其他不变的模板函数