0

我想创建基本相同但具有不同类型的类型安全结构,因此它们需要不同的函数签名。

struct A {
    Time t;
    void doStuff(const A&);
    A getStuff();
};

struct B {
    Time t;
    void doStuff(const B&);
    B getStuff();
};

如果我起诉班级的模板

template<class T>
struct X {
    Time t;
    void doStuff(const X&);
    X getStuff();
};

如何使函数类型安全并为类型 A 的结构 X 和类型 B 的结构 X 定义不同的函数签名?

4

2 回答 2

1

尝试添加一些未使用的模板参数。

template <int>
struct X{
    Time t;
    void doStuff(const X&); // You missed return type
    X getStuff();
}; // You missed a semicolon

// Great thanks to "aschepler"

现在你可以(C++11 语法)

using A = X<1>;
using B = X<2>;
// typedef X<1> A;
// typedef X<2> B;

以下代码将失败,这是您想要的:

A a; B b;
a.doStuff(b); // Fail
a = b.getStuff(); // Fail
于 2017-10-05T01:25:50.993 回答
0

您可以为此使用继承和模板的组合。
按照您的思路,可能的代码是:

template <class T> struct X {
    int time = 10;
    virtual void doStuff(const T&) = 0;
    virtual T getStuff() = 0;
};

struct A : X<A>
{
    void doStuff(const A& a) {
        cout << "Do A stuff" << endl;
    }

    A getStuff() {
        return *this;
    }
};

struct B : X<B>
{
    void doStuff(const B& value) {
        cout << "Do B stuff" << endl;
    }

    B getStuff() {
        return *this;
    }
};

然后,测试我们有:

int main()
{
    A a; B b;

    a.doStuff(a);  // Ok
    b.doStuff(b);  // Ok
    a.doStuff(b);  // fail
    b.doStuff(a);  // fail
    b = b.getStuff();  // Ok
    b = a.getStuff();  // fail

    return 0;
}
于 2017-10-05T02:00:05.260 回答