C++过载;相同类型的变量args

C++ overloading; variable args of same type?

本文关键字:变量 args 同类型 过载 C++      更新时间:2023-10-16

我有一个类,它的构造函数如下所示:

Chunker::Chunker(int chunkSizeX, int chunkSizeY){
    chunkX = chunkSizeX;
    chunkY = chunkSizeY;
}

我想为用户提供使chunkSizeYchunkSizeX具有默认值(需要由Chunker计算)的能力。

I.E,这样他们可能会传递一个"AUTO"关键字或其他什么东西,以便构造函数知道。

我可以做一些类似的事情吗:

Chunker::Chunker(int chunkSizeX, char chunkSizeY)
Chunker::Chunker(char chunkSizeX, int chunkSizeY)
Chunker::Chunker(char chunkSizeX, char chunkSizeY)

因此,如果它为其中一个或两个值获得char,它知道自动计算它们吗?

我相信他们一定是一种更好/标准的方式,我还不知道。。。。?

您可以使用一个特殊的空类来帮助:

struct Default {};
class Chunker
{
public:
    Chunker(int x, int y) : chunkX(x), chunkY(y) {}
    Chunker(Default, int y) : chunkX(42), chunkY(y) {}
    Chunker(int x, int Default) : chunkX(x), chunkY(42) {}
private:
    int chunkX;
    int chunkY;
};

用法:

Chunker c(1, 2);
Chunker cx(3, Default{});
Chunker cy(Default{}, 4);

或使用"静态生成器"

class Chunker
{
public:
    Chunker(int x, int y) : chunkX(x), chunkY(y) {}
    static Chunker FromX(int x) { return Chunker(x, 42); }
    static Chunker FromY(int y) { return Chunker(42, y); }
private:
    int chunkX;
    int chunkY;
};

用法:

Chunker c(1, 2);
Chunker cx = Chunker::FromX(3);
Chunker cy = Chunker::FromY(4);

只需编写一个构建Chunkers的助手类,类似于:

class MakeChunker {
    void setX(int x) { ...
    void setY(int y) { ...
    Chunker make()

我建议Boost.可选,它会给你这样的代码:

void function(optional<int> x, optional<int> y) {
    if (x) {
        // use *x
    }
    if (y) {
        // use *y
    }
}

也就是说,对于构造函数的情况,有时在类中添加一个静态工厂函数是个好主意:

class Chunker {
    static Chunker create_with_x(int x) {
        ...
    }
    static Chunker create_with_y(int y) {
        ...
    }
};

您可以在C++中指定多个构造函数,只要它们具有不同的签名,编译器将为每个调用选择合适的构造函数。

所以你可以完美地做到:

Chunker.cpp

Chunker::Chunker(int chunkSizeX, char chunkSizeY) {...} // First constructor
Chunker::Chunker(char chunkSizeX, int chunkSizeY) {...} // Second constructor
Chunker::Chunker(char chunkSizeX, char chunkSizeY) {...} // Third constructor

然后在程序的另一个文件中:

Chunker::chunker chunker1 = Chunker::Chunker(1, 'b') // First constructor is used
Chunker::chunker chunker2 = Chunker::Chunker('a', 2) // Second constructor is used
Chunker::chunker chunker3 = Chunker::Chunker('a', 'b') // Third constructor is used