c++ - 将参数包传递给别名模板(具有非包参数)的解决方法

标签 c++

看这个例子:

template <typename A>
struct Foo1 {};

template <typename A, typename B>
struct Foo2 {};

struct Bar1 {
    template <typename A>
    using Foo = Foo1<A>;
};

struct Bar2 {
    template <typename A, typename B>
    using Foo = Foo2<A, B>;
};

template <typename BAR>
struct Something {
    template <typename ...P>
    void func(typename BAR::template Foo<P...> foo) {
    } 
};

我想实现:如果Something专门用于 Bar1 , 那么我想要一个模板函数 func ,即:

   template <typename A>
   void func(Foo1<A> foo)

如果Something专门用于 Bar2 , 然后 func应该是:

   template <typename A, typename B>
   void func(Foo2<A, B> foo)

但是,这种直截了当的方法是行不通的,因为 clang 会报错(你需要实例化 Something<BarX> 才能让 clang 报告这个错误):

error: pack expansion used as argument for non-pack parameter of alias template void func(typename BAR::template Foo<P...> foo) {

所以看起来别名模板不是 100% 透明的(我发现了一些关于这个的讨论:CWG 1430,这是设计使然)。

是否有解决此问题的方法?

(gcc 编译此代码,但根据 CWG 1430,这可能是无意的)

最佳答案

解决方法是使别名可变:

struct Bar1 {
    template <typename... Ts>
    using Foo = Foo1<Ts...>;
};

struct Bar2 {
    template <typename... Ts>
    using Foo = Foo2<Ts...>;
};

Demo

关于c++ - 将参数包传递给别名模板(具有非包参数)的解决方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70744937/

相关文章:

c++ - 是否可以在 Windows 上以编程方式卡住线程?

c++ - "Symbol ' 在命名空间中映射 ' could not be resolved"

c++ - fatal error LNK1561 : entry point must be defined

c++ - 检查多种文件类型的方法

c++ - 如何使用 SML 随机生成 Oct-Tuple

java - 用另一种语言包装 C++ 对象的策略——内存管理

c++ - C和C++的关系

c++ - 为了在 C++ 中线程安全,我应该使用互斥锁保护原始类型上的操作吗?

c++ - 访问 opencv 矩阵 CV_32S 元素

c++ - 在 C++ 中使用 printf 制作表格