【问题标题】:Defaulting member variable pointer when its a template parameter模板参数时默认成员变量指针
【发布时间】:2015-09-15 17:52:25
【问题描述】:

我需要一个模板类。我想向模板传递一个类型,然后是两个成员变量指针。我希望将第二个指针默认为 NULL,因此是可选的。这可能吗?如果可以,语法是什么?

我期望的语法是

template<typename T, int T::*VALUE1, int T::*VALUE2 = NULL>
class Foo { ... }

但是,当我尝试实例化此类的实例时;

Foo<Bar, &Bar::var1> fooBar;

虽然使用以下作品进行实例化

Foo<Bar, &Bar::var1, &Bar::var2> fooBar

给出的错误(来自 g++ 4.4)是

错误:无法将模板参数“0l”转换为“int Bar::*”

请注意,我不能使用 c++11,因此不能使用 nullptr

【问题讨论】:

  • 但是,当您尝试实例化(而不是煽动)...什么?它不编译吗?编译器给出什么错误?
  • 因为你在应该使用nullptr时使用NULL
  • nullptr 会很好,但我不能使用 c++11 所以不能使用它

标签: c++ templates


【解决方案1】:

这种限制从一开始就存在于语言中。在 C++98 中,不允许将 0 用作指针类型或指向成员类型的任何模板参数的非类型模板参数。例如。这是无效的

template <int *p> struct S {};
...
S<0> s1; // ERROR: `0` is not a valid argument for `int *` parameter
S<(int *) 0> s2; // ERROR: unacceptable address expression

换句话说,在 C++ 语言的原始版本中,您根本不允许将空指针作为模板参数传递。它被语言作者故意阻止。这样做的机会只出现在 C++11 中,并引入了nullptr

【讨论】:

  • 谢谢,这也是我的结论,但希望我错了。
【解决方案2】:

正如here 所解释的,指向类成员的指针用于提供对类成员的间接访问。现在对于对象 foobar1 的声明,需要一个类模板,该类模板接受类 bar 的一个成员。

现在你的第二个调用是完全不同的类模板,它想要访问类 Bar 的两个成员。

因此,您必须为此目的定义两个不同的类模板 foo1 和 foo2,如下所示:

  template<typename T, int T::*VALUE1>
  class Foo1 { ... }

  template<typename T, int T::*VALUE1, int T::*value2>
  class Foo2 { ... }

你会这样称呼它们:

  Foo1<Bar,&Bar::var1> foobar1;//use first class template Foo1
  Foo2<Bar,&Bar::var1,&Bar::var2> foobar2;//use second class template Foo2

【讨论】:

  • 你指的是什么“功能”?
  • 我已经编辑了我的答案,当我可以使用电脑时,我会回复它
  • 对不起,但这并不能回答我的问题,并且两次实施模板类将是一个维护问题。因此,虽然它可能需要这样做,但我希望有一种语法来编写它。正如其他人提到的那样,这确实存在于 c++11 通过 nullptr 但不幸的是我不能使用它
  • 我做了一些研究,我认为没有 c++11 就无法实现您想要做的事情
【解决方案3】:

使用nullptr:

struct Bar
{
    int var1;
};

template<typename T, int T::*VALUE1, int T::*VALUE2 = nullptr>
struct Foo
{

};

int main()
{
    Foo<Bar, &Bar::var1> fooBar;
    return 0;
}

实时示例:https://ideone.com/2ICSBJ

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-24
    相关资源
    最近更新 更多