【问题标题】:template function for complex types复杂类型的模板函数
【发布时间】:2021-11-09 19:56:28
【问题描述】:

在 C++17 或更早版本中是否有任何方法可以在下面的代码中使用函数 compute 的单个模板实现?

template <typename T>
class C
{
    public:

        T x, y;

        C() = default;
        C(T x, T y) : x(x), y(y) {}

        operator T() const { return x; }
        C operator +(const C<T> &c) const { return C(x + c.x, y + c.y); }
        C operator +(const T &t) const { return C(x + t, y); }
};

template <typename T>
void compute(C<T> *a, T *b, size_t size)
{
    while (size--)
        a[size] = a[size] + b[size];
}

template <typename T>
void compute(T *a, C<T> *b, size_t size)
{
    while (size--)
        a[size] = a[size] + b[size];
}

template <typename T>
void compute(C<T> *a, C<T> *b, size_t size)
{
    while (size--)
        a[size] = a[size] + b[size];
}

int main()
{
    const size_t size = 4;
    C<float> a[size];
    float b[size];
    compute(a, b, size);
    compute(b, a, size);
    compute(a, a, size);
}

【问题讨论】:

  • 你不能在模板中添加另一个类型U吗?
  • 你想做到多严格? C&lt;float&gt;[]double[] 可以吗?
  • 有,但不漂亮。如果您关心的是重复主体,您总是可以拥有每个函数调用的通用实现。
  • temnplate &lt;typename A,typename B&gt; void compute(A* a,B* b,size_t size) 有什么问题?
  • 目的是在 *a*b 参数的情况下,我需要强制 C 具有完全相同的类型。喜欢C &lt;T&gt; *a, T *b。是的,我关心的是重复体,

标签: c++ templates c++17


【解决方案1】:

是的,如果您愿意容忍一些样板文件(我想您有很多很多功能,就像compute)。

template <typename A, typename B>
struct is_cable_t : std::false_type {};

template <typename A>
struct is_cable_t<A, C<A>> : std::true_type {};

template <typename A>
struct is_cable_t<C<A>, A> : std::true_type {};

template <typename A>
struct is_cable_t<C<A>, C<A>> : std::true_type {};

template <typename A, typename B>
constexpr bool is_cable_v = is_cable_t<A,B>::value;

template <typename K, typename S, 
          typename R = typename std::enable_if<is_cable_v<K,S>>::type>
void compute(K *a, S *b, size_t size)
{
    while (size--)
        a[size] = a[size] + b[size];
}

【讨论】:

  • 它做到了!有什么办法可以简化吗?我想让其他代码阅读者清楚:)
猜你喜欢
  • 2010-09-15
  • 1970-01-01
  • 1970-01-01
  • 2011-07-17
  • 1970-01-01
  • 1970-01-01
  • 2014-12-11
  • 1970-01-01
  • 2017-10-26
相关资源
最近更新 更多