gpt4 book ai didi

c++ - 从模板类继承繁琐

转载 作者:太空宇宙 更新时间:2023-11-04 11:35:34 24 4
gpt4 key购买 nike

以下是具有某些功能的模板的代码。几个结构将从它继承,每个结构将使用不同的 UniqueTag。也就是说,每个结构都继承自一个唯一的模板。通过天真​​的尝试 #1,代码变得非常冗长。尝试 #2 在冗长方面要好一些,但删除了能够使用模板实例化更改 UniqueTag 值的所需属性。 #3 的宏版本几乎没有改善。

我当然不是c++语法大师,这让我想知道:这个能表达得更清楚吗?

尝试 #1

template <int UniqueTag, typename Verbose, typename Arguments>
struct Base {
static const int tag = UniqueTag;
// Random example functionality
float data_;
Base(float data) : data_(data) {}
int do_stuff(Verbose& v, Arguments& a) {
return v + a;
}
};

template <int UniqueTag, typename Verbose, typename Arguments> // once...
struct Foo : Base<UniqueTag, Verbose, Arguments> { // twice...
typedef Base<UniqueTag, Verbose, Arguments> base_t; // thrice..!
Foo(float data) : base_t(data) {}
int do_it() {
Verbose v(10);
Arguments a(10);
return base_t::do_stuff(v, a); // must qualify dependent class name
}
};

尝试 #2

稍微更明智的方法是将模板参数存储在基类中。现在 Foo 不必是模板类。它可以从模板继承并通过它引用类型,没有依赖类问题。 然而,它确实带走了 Foo2 的模板特性,这是 Not Acceptable 。

template <int UniqueTag, typename Verbose, typename Arguments>
struct Base2 {
typedef Verbose verbose_t;
typedef Arguments arguments_t;
static const int tag = UniqueTag;
float data_;
Base2(float data) : data_(data) {}
int do_stuff(Verbose& v, Arguments& a) {
return v + a;
}
};

typedef Base2<1, int, int> Foo2Base;
struct Foo2 : Foo2Base {
Foo2(float data) : Foo2Base(data) {}
int do_it() {
verbose_t v(10);
arguments_t a(10);
return do_stuff(v, a);
}
};

尝试 #3

前面示例的宏版本也是可能的,但它只节省了一行,同时使代码不那么明显。

#define BASE_MACRO(name, tag, typeA, typeB) \
typedef Base2<tag, typeA, typeB> name ## Base; \
struct name : name ## Base

BASE_MACRO(Foo3, 2, int, int) {
Foo3(float data) : Foo3Base(data) {}
int do_it() {
verbose_t v(10);
arguments_t a(10);
return do_stuff(v, a);
}
};

// To compile all of the above.
#include <iostream>
int main() {
Foo<0, int, int> a(1.0);
std::cout << a.do_it() << std::endl;
Foo2 b(1.0);
std::cout << b.do_it() << std::endl;
Foo3 c(1.0);
std::cout << c.do_it() << std::endl;
};

如果是这种情况,即使是明确的“没有更好的方式来表达这一点”也会有所帮助。

最佳答案

怎么样?

使 do_stuff 成为模板方法

template <int UniqueTag>
struct Base {
static const int tag = UniqueTag;
// Random example functionality
float data_;
Base(float data) : data_(data) {}
template <typename Verbose, typename Arguments>
int do_stuff(Verbose& v, Arguments& a) {
return v + a;
}
};

template <int UniqueTag, typename Verbose, typename Arguments> // once...
struct Foo : Base<UniqueTag> { // shorter reference
typedef Base<UniqueTag> base_t; // shorter reference
Foo(float data) : base_t(data) {}
int do_it() {
Verbose v(10);
Arguments a(10);
return base_t::do_stuff(v, a); // must qualify dependent class name
}
};

保持 Foo 的模板特性,同时减少冗长

关于c++ - 从模板类继承繁琐,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23167951/

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