假设您有以下结构来连接两个模板结构:
/// concat.hpp template<typename...> struct concat_struct; // concat_specialization.hpp template<std::size_t... m, std::size_t... n> struct concat_struct<$CLASSNAME<m...>, $CLASSNAME<n...>> { using type = $CLASSNAME<m..., n...>; }; template<typename a, typename b> using concat = typename concat_struct<a, b>::type;
我现在可以做了
#include "concat.hpp" #define $CLASSNAME MyClass #include "concat_specialization.hpp" #undefine $CLASSNAME #define $CLASSNAME MyOtherClass #include "concat_specialization.hpp"
事实上,如果我再次包含“concat_specialisation.hpp”,这很容易导致冲突。C++如何处理可变模板的多种特殊化?
你不需要明确地为每个项目写一个专业化 $CLASSNAME 。您只需将模板模板参数添加到专门化中,就会自动推断出来:
$CLASSNAME
template<template<std::size_t...> typename C, std::size_t... m, std::size_t... n> struct concat_struct<C<m...>, C<n...>> { using type = C<m..., n...>; };
这是一个 demo