在 C++ 中运行时选择模板参数

发布于 2024-07-14 07:20:10 字数 111 浏览 8 评论 0原文

假设我有一组函数和类,它们被模板化为使用单精度(float)或双精度。 当然,我可以只编写两段引导代码,或者弄乱宏。 但是我可以在运行时切换模板参数吗?

Suppose I have a set of functions and classes which are templated to use single (float) or double precision. Of course I could write just two pieces of bootstrap code, or mess with macros. But can I just switch template argument at runtime?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

多彩岁月 2024-07-21 07:20:10

不,您无法在运行时切换模板参数,因为模板是由编译器在编译时实例化的。 您可以做的是让两个模板都派生自一个公共基类,始终在代码中使用基类,然后决定在运行时使用哪个派生类:

class Base
{
   ...
};

template <typename T>
class Foo : public Base
{
    ...
};

Base *newBase()
{
    if(some condition)
        return new Foo<float>();
    else
        return new Foo<double>();
}

宏与模板有相同的问题,因为它们是在编译时扩展的。

No, you can't switch template arguments at runtime, since templates are instantiated by the compiler at compile-time. What you can do is have both templates derive from a common base class, always use the base class in your code, and then decide which derived class to use at runtime:

class Base
{
   ...
};

template <typename T>
class Foo : public Base
{
    ...
};

Base *newBase()
{
    if(some condition)
        return new Foo<float>();
    else
        return new Foo<double>();
}

Macros have the same problem as templates, in that they are expanded at compile-time.

旧街凉风 2024-07-21 07:20:10

模板是一种编译时机制。 顺便说一句,宏也是如此(严格来说 - 一种预处理机制 - 甚至在编译之前就出现了)。

Templates are a compile-time mechanism. BTW, macros are as well (strictly speaking - a preprocessing mechanism - that comes even before compilation).

逆流 2024-07-21 07:20:10

模板纯粹是编译时构造,编译器将扩​​展模板并使用指定的参数创建类/函数,并将其直接转换为代码。

如果您尝试在运行时在 foofoo 之间切换,您要么需要使用一些元编程技巧,要么只需要单独的代码路径每个。

Templates are purely a compile time construct, the compiler will expand a template and create your class/function with the specified argument and directly translate that to code.

If you are trying to switch between foo<float> and foo<double> at runtime, you'll either need to use some metaprogramming trickery or just have seperate code paths for each.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文