有条件地启用构造函数

发布于 2024-10-25 04:15:48 字数 377 浏览 4 评论 0原文

以下是我如何有条件地启用类的构造函数:

struct Foo
{

    template<class T>
    Foo( T* ptr, boost::enable_if<is_arithmetic<T> >::type* = NULL )
    {}

};

我想知道为什么我需要通过虚拟参数进行启用。为什么我不能只写:

struct Foo
{
    template<class T>
    Foo( boost::enable_if<is_arithmetic<T>, T>::type* = NULL )
    {}
};

Here is how I can conditionally enable a constructor of a class :

struct Foo
{

    template<class T>
    Foo( T* ptr, boost::enable_if<is_arithmetic<T> >::type* = NULL )
    {}

};

I would like to know why I need to do the enabling via a dummy parameter. Why can I not just write :

struct Foo
{
    template<class T>
    Foo( boost::enable_if<is_arithmetic<T>, T>::type* = NULL )
    {}
};

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

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

发布评论

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

评论(1

全部不再 2024-11-01 04:15:48

您可以使用除构造函数之外的任何其他函数,因为这样您就可以修改函数名称,包括模板参数。

Foo foo;
foo.Method<T>();

但是,对于构造函数,构造函数名称永远不会出现在表达式中,因此没有地方可以显式放置模板参数。你必须从论证中推断出来。

Foo<T> foo; // no good, assumes the type Foo is a template, not its constructor
Foo* pfoo = new Foo<T>(); // same problem

Foo foo((T*)0); // ok, deduced
Foo* pfoo = new Foo((T*)0); // same

You can on any other function but the constructor, because then you can modify the function name including the template arguments.

Foo foo;
foo.Method<T>();

With a constructor, though, the constructor name never appears in your expression, so there's no place to explicitly put the template parameter. You have to deduce it from an argument.

Foo<T> foo; // no good, assumes the type Foo is a template, not its constructor
Foo* pfoo = new Foo<T>(); // same problem

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