Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/136.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在模板中完成typename的预处理器魔术_C++_Templates_C Preprocessor - Fatal编程技术网

C++ 在模板中完成typename的预处理器魔术

C++ 在模板中完成typename的预处理器魔术,c++,templates,c-preprocessor,C++,Templates,C Preprocessor,我有一堆用户定义的结构;我们叫他们A、B和C 我不能修改它们,我需要添加日志功能;因此,我添加了这些结构的我自己的日志版本来帮助实现这一点。 让我们把它们叫做A_Log、B_Log和C_Log 我正在使用名为LogState(const T*ptr)的成员函数创建一个模板StateLogger类,其中T是a、B或C template <typename T> class StateLogger { public: void LogState(const T *ptr)

我有一堆用户定义的结构;我们叫他们A、B和C

我不能修改它们,我需要添加日志功能;因此,我添加了这些结构的我自己的日志版本来帮助实现这一点。 让我们把它们叫做A_Log、B_Log和C_Log

我正在使用名为
LogState(const T*ptr)
的成员函数创建一个模板StateLogger类,其中
T
是a、B或C

template <typename T>
class StateLogger {
    public:
    void LogState(const T *ptr);

    private:
    std::vector<T> requests;
};
模板
类状态记录器{
公众:
无效日志状态(常数T*ptr);
私人:
向量请求;
};
在这个函数中,我打算构造A_Log/B_Log/C_Log结构

template<typename T>
void StateLogger<T>::LogState(const T *ptr) {
    ...
    VOODOO myLog = VOODOO(ptr);

}
模板
无效状态记录器::日志状态(常量T*ptr){
...
伏都教myLog=伏都教(ptr);
}
我想知道我是否可以使用一些预处理器魔法将
\u Log
附加到
T
中的
voodo
。 因此,如果我使用
StateLogger::LogState(a_ptr)
我希望编译器生成
A_Log
而不是
Voodoo

我意识到我可以使用模板专门化来解决这个问题,但我对此很好奇;
template <class T> struct logger_type;
template <> struct logger_type<A> {
    typedef A_Log type;
};
模板结构记录器\u类型{ typedef A_日志类型; }; 等等

因此,无论何时需要记录器,只要使用
typename logger\u type::type

template struct logger\u type;
模板结构记录器\u类型{
typedef A_日志类型;
};
等等


因此,无论何时需要记录器,只需使用
typename logger\u type::type

无需预处理器破解即可!您不能在这里使用预处理器,因为只有在预处理器已经运行之后才实例化模板。也就是说,您不能使用用于在预处理器中实例化模板的类型名称。请不要对此进行预处理器破解!您不能在这里使用预处理器,因为只有在预处理器已经运行之后才实例化模板。也就是说,您不能使用用于在预处理器中实例化模板的类型名称。如果需要,您可以在此基础上使用预处理器魔术:foreach type T,specialize logger_type for T。谢谢!“我希望有一种方法不必对每一个结构都进行打字。”拉贾-是的,我没有读完整的问题就回答了。但一般来说,这种事情不能用预处理器来完成,所以通常用“traits”来完成,我展示的代码就是一个简单的例子。如果你愿意,你可以在上面使用预处理器魔法:foreach type t,specialize logger\u type for t。谢谢!“我希望有一种方法不必对每一个结构都进行打字。”拉贾-是的,我没有读完整的问题就回答了。但一般来说,这种事情不能用预处理器来完成,所以通常用“traits”来完成,我展示的代码就是一个简单的例子。