【问题标题】:How to define two C++ constructors with two different type having same base type如何定义两个具有相同基类型的不同类型的 C++ 构造函数
【发布时间】:2015-01-19 10:13:46
【问题描述】:

我有两个简单的类型定义为 int:

typedef int type_a;
typedef int type_b;

我想为类中的每种类型创建一个构造函数。我尝试使用显式关键字,但它不起作用我收到一条编译消息“无法重载”。

class Test {
public:
  explicit Test(type_a a){

  }
  explicit Test(type_b b){

  }
};

将一种类型更改为无符号 (typedef unsigned int type_b;) 可以解决问题,但我真的希望保持两种类型的定义相同。

C++ 可以处理这种情况吗?

【问题讨论】:

  • typedefs 是类型的别名。所以type_atype_b 是同一类型:int。所以你不能做你想做的任何事情。
  • 您可以将ints 包装在两个单独的类中。也许如果type_atype_b 确实代表不同的类型,那么您也许可以为这些类型定义不同的接口。
  • 你应该告诉我们为什么你想让type_atype_b都成为int。然后我们可以了解您要解决的问题(而不是您的解决方案),并建议对实际潜在问题的理智方法。
  • 对您的要求一无所知:您可能想看看作用域枚举。
  • 好吧,我简化了问题的问题,但我的类型定义为 uint32_t。一个是audio_id,另一个是video_id。该类表示使用这些属性“Type type; union { audio_id aid; video_id vid;};”定义的DataType。我需要 uint32_t 因为我正在将它写入文件并将其读取到文件中。

标签: c++ constructor


【解决方案1】:

C++ 可以处理这种情况吗?

简短的回答:不。 typedefs 是类型的别名。所以type_atype_b 是同一类型:int。这意味着您正在尝试这样做:

class Test {
public:
  explicit Test(int a) {}
  explicit Test(int b) {}
};

由于不清楚为什么您想要这个,因此很难提出可能的解决方案。但是如果你要实现一个不同的整数类型,你可以有一个单独的构造函数。

还要注意explicit与此无关。

【讨论】:

  • 感谢您的回答。正如我上面所说,我简化了问题的问题,但我的类型被定义为 uint32_t。一个是audio_id,另一个是video_id。该类表示使用这些属性“类型类型;联合 { audio_id 辅助;video_id vid;};”定义的 DataType。我需要 uint32_t 因为我正在将它写入文件并将其读取到文件中。
  • @SaiyanRiku 但是为什么你需要一个联合来保存两个相同类型的实体呢?这没有多大意义。
  • 因为现在我只有两种类型,但我以后可能会添加更多类型,可能使用另一种类型定义(uint16_t),音频相关函数处理audio_id,视频函数处理video_id .
  • @SaiyanRiku 但是你没有两种类型。你只有一个。这就是重点。
  • 我明白你的意思,但是构造函数不同,一组“type = Video; this->video_id = video_id;”和其他“type = Audio; this->audio_id = audio_id;”,我可以接受将联合更改为唯一的 uint32_t 变量,但我的问题是调用构造函数。我想将定义的 video_id (#define VIDEO_H264 MAKE_FOURCC('H','2','6','4')) 转换为使用 DataType(VIDEO_H264)。
【解决方案2】:

您有一个选择是使用包含“域”的模板类型包装参数:

template <typename Type, typename Domain>
class TypeWrapper {
public:
   TypeWrapper(Type);
   operator Type ();
};

typedef int type_a;
typedef int type_b;

typedef TypeWrapper<type_a, class type_a_domain> type_a_wrapper;
typedef TypeWrapper<type_b, class type_b_domain> type_b_wrapper;

class Test {
public:
  explicit Test(type_a_wrapper a);
  explicit Test(type_b_wrapper b);
};

【讨论】:

  • 感谢您的回答,我试过了,但它并不能完全解决我的问题,因为我必须为类型包装器添加强制转换 => Test a((type_a)val);不起作用。
  • @SaiyanRiku:juanchopanza 的回答是正确的,您无法在 C++ 中将两个 typedef 区分为相同的底层类型。这个想法是尝试在你的代码中使用'type_a_wrapper'而不是'type_a'?例如,返回“type_a”的 API 将立即转换为 type_a_wrapper。例如; type_a_wrapper var_ ( call_returning_type_a() ); Test t(var_);
猜你喜欢
  • 2010-09-07
  • 1970-01-01
  • 1970-01-01
  • 2012-05-12
  • 2018-01-18
  • 1970-01-01
  • 2011-10-15
  • 2012-10-17
  • 1970-01-01
相关资源
最近更新 更多