模板参数不可见是否有解决方法?

问题描述

考虑以下代码

template<typename... Args1> 
constexpr size_t direct = sizeof... (Args1);

template<template<typename... Args1> typename A1> 
constexpr size_t nested = sizeof... (Args1); // compile error ☹️

嵌套行无法编译,因为(我认为)Args1 是嵌套参数。

有没有办法以非侵入性的方式解决这个问题?侵入性是指修改传递的类型,例如添加

constexpr size_t sizeof_args = sizeof... (Args...);

传递给这个模板的每个模板。

注意:我很擅长使用 C++20 概念,但 AFAIK 他们在这方面没有提供改进。

解决方法

您可以编写一个主变量模板,然后为模板模板参数专门化变量模板。

这允许您单独显式命名模板模板参数的模板参数:

template<typename ...> 
constexpr size_t nested = -1; // any value will do,// but prefer one that is invalid for specializations

template<template<typename ...> typename A1,typename... Args1> 
                // name the parameters here  ^_______________^
constexpr size_t nested<A1<Args1...>> = sizeof...(Args1);
    // specialize here ^____________^

C++20 中添加的概念特性在这里没有任何帮助,因为没有任何限制。

这是一个 demo