用相同的 args 声明两个构造函数的最常用方式是什么?

Eri*_*tch 1 c++ constructor class

举个例子,假设我有一个名为File. 现在文件可以以二进制或文本形式打开。我的构造函数目前是File(const char*filename). 让我们假设 open 的实现是完全不同的二进制和文本。我到底要怎么构造这个?

我考虑过使用静态函数,但我不想返回指针。我可以传入一个指针,但我宁愿不允许在没有实际初始化的情况下构造一个类。

我正在考虑在构造函数中使用 enum 或 bool ,但对我来说感觉“错误”(以及我可能这样做的方式)。我可以为二进制和文本使用不同的类名,并且两者都继承基本实现(或其他实现),即使唯一的区别是构造函数。

在 C++ 中这样做最惯用的方法是什么?

Mes*_*kon 10

添加标志

enum class open_mode
{
    binary,
    text
};

File(const char* filename, open_mode mode);
Run Code Online (Sandbox Code Playgroud)

或使用标签

struct binary_tag { };
struct text_tag { };
File(const char* filename, binary_tag);
File(const char* filename, text_tag);
Run Code Online (Sandbox Code Playgroud)


Que*_*tin 7

两种惯用的方式是工厂函数(没有什么会强制您返回指针)或标记调度(在标准库中使用,例如在 中std::variant)。

// Factory functions
struct File {
    static File openText(char const *filename);
    static File openBinary(char const *filename);
};



// Tag dispatching
struct open_as_binary_t {} constexpr open_as_binary;
struct open_as_text_t {} constexpr open_as_text;

struct File {
    File(char const *filename, open_as_binary_t);
    File(char const *filename, open_as_text_t);
};
Run Code Online (Sandbox Code Playgroud)