[英]Passing Arguments to Function using Template Types
我将IMO推向C ++模板编程的极限。 该系统是Arduino,但我的尝试适用于任何微控制器系统。
我使用带有'int'参数的模板类来定义Pins
template<const int pin>
struct Pin {
Pin() { mode(pin, 0); }
};
template<const int pin>
class PinOut : public Pin<pin> {};
我可以创建模板类来使用PinOut:
template<typename F>
class M {
public:
M() { }
F mF;
};
M<PinOut<1>> m1;
template<int F>
class N {
public:
N() { }
Pin<F> mF;
};
N<1> n1;
但是我不想在使用PinOut的类中使用模板。 这说明了我的想法,表明了可能的方法,但显然行不通。
class R {
public:
R(const int i) {
}
PinOut<i> mF; // create template instance here
};
R r1(1); // what I'd like to able to do
我知道问题是在类R中创建了一个类型。
另一种可能性是实例化PinOut变量并将其传入,但是再次在类内部传递并创建类型是一个问题。 像这样:
class S {
public:
S(PinOut<int>& p) { } // how to pass the type and instance
PinOut<p>& mF; // and use it here
};
PinOut<1> pp;
S s1(pp);
抱歉,如果声音突然变大,请不要问为什么或我要做什么。 这是一个实验,我在推动对C ++的理解,尤其是模板。 我知道还有其他方法。
是的,任何采用该类型的函数本身都必须是模板。
但是,整个Pin系列是否以某种事物在不知道T的情况下有意义的方式相关? 可以使用非模板的基类来处理。 基类的想法特别方便,因为它可以包含确实了解T的虚函数。这使您可以根据需要在编译时和运行时多态之间进行切换。 极端地讲,使用Java和.NET中相同的“泛型”语法,这变成了较弱的想法。
更笼统地说,这是一个称为类型擦除的概念。 您可以搜索该术语以了解更多信息。 它被设计到库中,以使通用代码通用,并防止通过多个实例化对同一段落进行不必要的乘法。
在您的情况下, pin
是非类型参数,泛型甚至不这样做。 但这可能根本不会真正影响类型:成员根据pin
变化如何? 这可能是数组边界,或者是用于提供编译时知识和优化的编译时常量,或者仅仅是为了使类型不同而已。
所有这些情况都是可以在运行时处理的。 如果是制作不同类型的唯一目的(如让你打发时间值和距离值,以正确的参数编译器检查),那么真正的胆量都在省略了独特的基类。
如果是可以在运行时管理的数组绑定或其他类型差异,则基类或适配器/代理也可以在运行时进行管理。 更一般地,不影响类布局的编译时常量可以在运行时以相同的效果被知道,只是优化较少。
从您的示例来看,将pin用作构造函数参数是明智的, 可以使用运行时配置以常规方式实现该类。 为什么是模板? 大概是为了进行编译时检查,以使单独的东西分开。 但这并不会导致它们以不同的方式工作,因此您希望编译时部分是可选的。 因此,在这种情况下,基类可以解决问题:
class AnyPin
{
public:
AnyPin (int pin); // run-time configuration
};
template <int pin>
class Pin : public AnyPin { ⋯ };
现在,您可以编写采用AnyPin的函数,或编写采用Pin <5>并进行编译时检查的函数。
那么你到底是什么pin
做的类,在它的布局和功能方面? 它是否做任何使仅将其实现为运行时构造函数值的操作都无法接受的事情?
您要求我们不询问您要做什么,但是我必须说模板具有某些功能和优点,并且必须有一些使其成为模板的原因。 简单地说,以语言为中心的话,我是否错过了上面的分析? 如果我的摘要中没有包含C ++编程的理由,那么可以将其作为模板吗? 这可能就是为什么到目前为止您没有得到任何答案的原因。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.