gpt4 book ai didi

c++ - 将别名模板传递给它所依赖的模板的基类

转载 作者:搜寻专家 更新时间:2023-10-31 02:09:15 24 4
gpt4 key购买 nike

考虑以下代码,它定义了一个要作为模板模板参数传递的别名模板:

template<template<class T> class SomeFoo>
class Base {};

template<class T, class Bar>
class Foo {};

class Bar;

template<class T>
using BarFoo = Foo<T, Bar>;

class Bar : public Base<BarFoo> {};

这按预期工作。但是,如果 Bar 本身是一个模板,则此解决方案不可行,因为别名模板取决于 Bar 的具体实例化。在 Bar 中定义别名模板也无济于事,因为在给定基类时它还不可用。由于似乎不可能在参数列表中“即时”定义别名模板,我唯一能想到的解决方法是将 Bar 传递给 Base 并在那里定义别名模板:

template<template<class T, class Derived> class SomeFooTL, class Derived>
class Base
{
template<class T>
using SomeFoo = SomeFooTL<T, Derived>;
};

template<class T, class Bar>
class Foo {};

template<class S>
class Bar : public Base<Foo, Bar<S>> {};

然而,这是非常不令人满意的,因为可能有(并且有)其他 Foo 不依赖于 T 并且现在被迫采用不必要的第二个模板参数。

有人知道实现此目标的更好方法吗?

最佳答案

如果我正确理解你想要什么,你需要一个助手,并使用一个不明显的语法:

template<template<class> class>
class Base {};

template<class, class>
class Foo {};

template <typename> class Bar;

template <typename S> struct UsingHelper {
template <typename T>
using BarFoo = Foo<T, Bar<S>>;
};

template <typename S>
class Bar : public Base<UsingHelper<S>::template BarFoo> {};

templateUsingHelper<S>::template BarFoo 中需要因为它是一个依赖上下文,它将被“解释”为值而不是没有。 (它类似于 typename my_class<T>::type ,但 BarFoo 是一个模板,而不是类型。)

关于c++ - 将别名模板传递给它所依赖的模板的基类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46689489/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com