如何优化可变参数模板专业化?
How to optimize variadic template specializations?
假设您有以下结构来连接两个模板化结构:
/// 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_specialization.hpp”,这很容易导致冲突。什么是 C++ 方法来处理可变参数模板的多个特化?
您不需要为每个 $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
假设您有以下结构来连接两个模板化结构:
/// 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_specialization.hpp”,这很容易导致冲突。什么是 C++ 方法来处理可变参数模板的多个特化?
您不需要为每个 $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