0

有没有办法拥有这样的模板类

template<bool state = true>
class A
{
};

并且有另一个类可以同时接受A<true>A<false>作为参数或字段,而不是模板类本身。像这样:

class B
{
public:
    B(A& arg_a)
       : a(arg_a)
    {}

private:
    A& a;
};

int main()
{
    A<true> aTrue;
    A<false> aFalse;
    B bTrue(aTrue);
    B bFalse(aFalse);
};

或者这根本不可能,因为具有不同模板参数的同一类的两个对象被编译器视为不同的类型?关于如何设计它的其他建议也将不胜感激。我知道如果我只是将模板参数设为类字段,这种设计是可能的,但我想知道这是否可以使用模板参数来完成。

4

1 回答 1

2

或者这根本不可能,因为具有不同模板参数的同一类的两个对象被编译器视为不同的类型?

类模板的两个不同的特化A<true>和类确实是不同的类型。A<false>A

您可以重载 的构造函数B以允许它们中的每一个:

struct B {
    B(const A<true>&);
    B(const A<false>&);
}

或者您可以利用A从公共基类派生的任何专业化的多态性:

#include <ios>
#include <iostream>

struct Base {
    virtual bool getState() const = 0;
};

template<bool state = true>
struct A : public Base {
    bool getState() const override { return state; }
};

struct B {
    bool state;
    B(const Base& base) : state(base.getState()) {}
};

int main() {
    A<true> a1{};
    A<false> a2{};
    std::cout << std::boolalpha 
        << B(a1).state << " "  // true
        << B(a2).state;        // false
}

正如@Jarod42 在评论中提到的那样,另一种选择是使用std::variant,因为您使用的是 C++17(或更高版本);特别是,std::variant<A<true>, A<false>>

于 2020-11-24T13:51:12.307 回答