c++ - 减少 C++ 中模板参数的重复

标签 c++ templates c++17

这不是主要的代码破解问题,我只是想知道我是否遗漏了一些巧妙的技巧。

如果我正在编写一个模板类,我可能会这样开始:

// some_header.h
template <typename TypeParameter, size_t max_array_size>
class TemplatedClass
{
    std::array<TypeParameter, max_array_size> MyTemplatedArray;

public:
    TypeParameter do_something()
    {
        /* do something with TypeParameter and max_array_sizein here */
    }
}

这很好,但是当我有不那么琐碎的模板化示例时,我倾向于将函数定义与声明分开,如下所示:

// some_header.h
template <typename TypeParameter, size_t max_array_size>
class TemplatedClass
{
    std::array<TypeParameter, max_array_size> MyTemplatedArray;

public:
    TypeParameter do_something();

    /*

    Many more function declarations

    */
}

template <typename TypeParameter, size_t max_array_size>
TemplatedClass<TypeParameter, max_array_size>::do_something()
{
    /* do something with TypeParameter and max_array_sizein here */
}

/*

Many more function definitions, all with:

template <typename TypeParameter, size_t max_array_size>
TemplatedClass<TypeParameter, max_array_size>

at the start

*/

这样做的目的是拥有一个经典的骨架类定义,其他人一眼就能轻松阅读。我不介意这样做,但烦人的是当我想修改模板参数时。第一个例子中的一个变化是什么,在第二个例子中最终变成了 1 + 2 * n 变化!

所以我想知道的是:有没有办法使第二个示例的模板参数更易于维护?可能类似于 typedef/using 或一些我没听说过的关键字?

最佳答案

首先是一个非答案:

假设,/*do something*/ 取决于模板参数。在那种情况下,必须修复签名是一个较小的问题。您需要修复实现。

另一种情况是/*do something*/不依赖于模板参数。然后您可以将这些方法移动到非模板基类。


更认真地尝试回答这个问题:

如果 TemplatedClass 只有一个而不是多个模板参数会怎么样?您可以使用单个标记,而不是为 TemplatedClass 使用一堆模板参数,并且可以将实际参数的定义推迟到特征:

#include <array>

template <typename Tag> struct value_type_impl;
template <typename Tag> using value_type = typename value_type_impl<Tag>::type;
template <typename Tag> constexpr int array_size = 123;

template <typename Tag>
class TemplatedClass {
    std::array<value_type<Tag>, array_size<Tag> > MyTemplatedArray;    
public:
    value_type<Tag> do_something();
};

template <typename Tag>
value_type<Tag> TemplatedClass<Tag>::do_something() {
    return {};
}

// the tag
struct foo_tag{};

// specializations for foo_tag:
template <> struct value_type_impl<foo_tag> { using type = int; };
template <> constexpr int array_size<foo_tag> = 123;


int main() {
    TemplatedClass<foo_tag> tc;
}

现在,负担就落在了模板的用户身上,定义一个标签,然后为该标签专门化所需的特征。但是,方法定义只有一个模板参数,在添加或删除更多“参数”(特征)时不需要更改。当然,您仍然需要修复实现。

如果您只是在寻找一些语法糖,我不知道在不更改模板本身的情况下会有什么帮助。

关于c++ - 减少 C++ 中模板参数的重复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68363216/

相关文章:

c++ - 关于虚函数模板化的问题

c++ - 对模板参数推导感到困惑

c++ - 当 const-ref 和 value 存在时,为什么转换运算符会导致不明确的重载

c++ - 有没有办法部分匹配可变参数模板参数包?

c++ - C++中的清理堆栈

c++ - get_driver_instance() 在 Qt 中崩溃

c++ - 如何用android ndk和eclipse编译c++11代码?

c++ - 将模板化的基类转换运算符引入派生范围

c++ - 带有指向自身指针的容器的模板类

c++ - 不可调用对象的示例赋值运算符?