【问题标题】:c++ function template aliasing long parameters?c ++函数模板别名长参数?
【发布时间】:2021-02-24 06:23:11
【问题描述】:

在函数模板中,参数的类型是由一些 trait 类决定的,所以它们的类型可能会变得很长

template<typename A>
void func(typename Traits<A>::some_type_x x1, typename Traits<A>::some_type_x x2);

有没有办法给这些类型起别名?我目前的解决方案是在模板参数中引入另一个类型名

template<typename A, typename X = typename Traits<A>::some_type_x>
void func(X x1, X x2);

但是这些可能会让函数调用者提供一些无效的参数,所以我想知道这个问题是否有更优雅的解决方案?

【问题讨论】:

  • 人们不会倾向于缩短std::vector&lt;int&gt; a, std::vector&lt;int&gt; b 对吧?但至少你仍然可以让它 int.o trait_type_t&lt;A&gt; x1, trait_type_t&lt;A&gt; x2
  • stackoverflow.com/a/19824531/5267751 中有一个 decltype 解决方案,它可能更短,也可能不会更短......
  • @user202729 是的,也许声明一些辅助类型就足够了。 decltype 解决方案仅在参数类型相同时才有效。但在我的用例中,一些参数涉及多个特征,并且它们共享一个顶级特征。

标签: c++ templates


【解决方案1】:

您可以像type support library 那样声明帮助器类型。例如

template<class T>
using Traits_x = typename Traits<T>::some_type_x;

然后将其用作

template<typename A>
void func(Traits_x<A> x1, Traits_x<A> x2);

【讨论】:

    【解决方案2】:
    template <typename A, typename X = typename Traits<A>::some_type_x>
    void func(X x1, X x2);
    

    有两个问题:

    • X 现在是可推断的(因此默认模板几乎没有用处)。
    • 正如你提到的,它可以被func&lt;A, int&gt;(42, 51);劫持

    对于第一个问题,你可以使用std::type_identity_t:

    template <typename A, typename X = typename Traits<A>::some_type_x>
    void func(std::type_identity_t<X> x1, std::type_identity_t<X> x2);
    

    第二个,你可以引入一个参数包,在它之间可以使用任何额外的参数:

    template <typename A, typename..., typename X = typename Traits<A>::some_type_x>
    void func(std::type_identity_t<X> x1, std::type_identity_t<X> x2);
    

    但不确定它是否比原版更好......

    【讨论】:

      猜你喜欢
      • 2016-11-18
      • 2016-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多