【问题标题】:Is it possible to create a template alias?是否可以创建模板别名?
【发布时间】:2015-05-15 04:03:33
【问题描述】:

考虑以下代码:

template< template< typename ... > class ... Ts >
struct unite
{
    template< typename ... T >
    struct type
        : Ts< T ... > ...
    { };
};

// This does not work as ::type does not name a type, but a template:

// template< template< typename ... > class ... Ts >
// using unite_t = typename unite< Ts ... >::type;

template< typename > struct debug_none {};
template< typename > struct debug_cout {};

template< typename ... > struct raise_demangled {};
template< typename ... > struct raise_specialized {};

template< typename, typename = int > struct match_default {};

template< template< typename ... > class Control >
void f()
{}

int main()
{
    f< unite< debug_none, raise_demangled, match_default >::type >();

    // Is there any way to create something like unite_t which works like this:

    // f< unite_t< debug_none, raise_demangled, match_default > >();
}

Live example

问题:有什么方法可以创建某种类似于类型别名的“模板别名”?(参见上例中的unite_t

【问题讨论】:

  • 所以,问题:我记得我在写的时候曾经问过这个确切的问题。我应该关闭我的stackoverflow.com/questions/17356487/… 作为这个的副本吗?或相反亦然? :)
  • @Yakk 尽管您的问题非常相似并且在同一区域,但我认为这并不是真正的重复,因为您试图在不同的地方摆脱 template 关键字。如果一个的解决方案存在,它可能也能解决另一个问题 - 但似乎没有解决方案。

标签: c++ c++11 c++14 type-alias


【解决方案1】:

不,你不能。

using 可以“返回”一个类型或一个变量。它不能“返回”template。其他地方没有类似的机制。

您可以通过遵循所有模板不是模板,而是在其中带有 template&lt;?&gt;using apply=?; 别名的类的约定来做一些模糊有用的事情(当我们这样做时,常量是 std::integral_constants&lt;T,?&gt;,指针是 @987654325 @)。

现在一切都是一个类。 templates 变成了类(带有::apply&lt;?...&gt;

将一组类型应用于此类模板将通过以下方式完成:

template<class Z, class...Ts>
using apply_t = Z::template apply<Ts...>;

因此,使用“本机”模板 Z,您可以使用 Z&lt;Ts...&gt;。使用这些“间接”模板,您可以使用apply_t&lt;Z, Ts...&gt;

使用此约定,模板using 别名可以返回间接模板。如果您的其余代码遵循始终调用apply_t 来应用模板的约定,并且您间接化您编写的所有其他模板,我们就完成了。

这太丑了。

【讨论】:

  • 有解决此问题的建议吗?
  • @Brian 不是我所知道的。需要这样的别名是有问题的,因为只有相对高级的 C++ 使用才需要它,所以也许没有人打扰。
  • 感谢您的回答,我可能很快会将其标记为“已接受”-“不,您不能”-部分 :) 遗憾的是,建议的替代方案/解决方法不能真正用于我的情况,因为它会使界面(对用户可见)更加复杂/丑陋。我实际上正在考虑放弃这个想法,而不是让用户感到困惑。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-02-22
  • 2013-02-01
  • 2021-11-03
  • 1970-01-01
  • 1970-01-01
  • 2018-11-28
  • 1970-01-01
相关资源
最近更新 更多