在成员结构的模板-模板参数中扩展外部结构的可变参数类型

xax*_*zak 5 c++ templates template-templates variadic-templates

如果您有模板结构,则可以使用 T 作为成员模板的值参数的类型:

\n
template <typename T>\nstruct SMoo\n    {\n        template <T I, typename T2>\n        struct SBaa {};\n    };\n\nSMoo<int>::SBaa<3, bool> moobaa;\n
Run Code Online (Sandbox Code Playgroud)\n

您可以对可变外部模板执行相同的操作:

\n
template <typename ... VT>\nstruct SMoo\n    {\n        template <VT ... VI, typename T2>\n        struct SBaa {};\n    };\n\nSMoo<int, bool>::SBaa<3, true, bool> moobaa;\n
Run Code Online (Sandbox Code Playgroud)\n

您还可以使用 T 作为成员模板的template-template 参数的 value 参数的类型:

\n
template <typename T>\nstruct SMoo\n    {\n        template <template <T I, typename T2> typename TT>\n        struct SBaa {};\n    };\n\ntemplate <int I, typename T>\nstruct SCaw {};\n\nSMoo<int>::SBaa<SCaw> moobaacaw;\n
Run Code Online (Sandbox Code Playgroud)\n

您可以将这些组合起来得到:

\n
template <typename ... VT>\nstruct SMoo\n    {\n        template <template <VT ... VI, typename T2> typename TT>\n        struct SBaa {};\n    };\n\ntemplate <int I, typename T>\nstruct SCaw {};\n\nSMoo<int>::SBaa<SCaw> moobaacaw;\n
Run Code Online (Sandbox Code Playgroud)\n

但只要有多个 VT 参数,这似乎就会失败:

\n
template <typename ... VT>\nstruct SMoo\n    {\n        template <template <VT ... VI, typename T2> typename TT>\n        struct SBaa {};\n    };\n\ntemplate <int I, typename VT>\nstruct SCaw {};\n\ntemplate <int I, bool B, typename VT>\nstruct SMew {};\n\nSMoo<int>::SBaa<SCaw> moobaacaw;\n\n//SMoo<int, bool>::SBaa<SMew> moobaamew; // <<=== FAILS HERE (WHY?)\nSMoo<int, bool>::SBaa<SCaw> moobaacaw2; // <<=== ALSO, DOESN'T FAIL HERE (WHY?)\n
Run Code Online (Sandbox Code Playgroud)\n

错误是:

\n
<FILE>:5:27: error: type/value mismatch at argument 1 in template parameter list for \xe2\x80\x98template<class ... VT> template<template<template<VT ...VI, class T2> class TT> template<class ... VT> template<VT ...VI, class T2> class TT> struct SMoo<VT>::SBaa\xe2\x80\x99\n   15 | SMoo<int, bool>::SBaa<SMew> moobaamew; // <<=== FAILS HERE (WHY?)\n      |                           ^\n<FILE>:15:27: note:   expected a template of type \xe2\x80\x98template<class ... VT> template<VT ...VI, class T2> class TT\xe2\x80\x99, got \xe2\x80\x98template<int I, bool B, class VT> struct SMew\xe2\x80\x99\n
Run Code Online (Sandbox Code Playgroud)\n

好像VT参数没有准确匹配。

\n

这可以解决吗?

\n