从实例化的crtp类型打印字符串

问题描述 投票:0回答:1

这是真实代码的片段,但想法是我想在日志中打印服务类型。 在此示例中,我尝试打印它,但出现异常,但我不知道为什么。 我还有其他使用编译时多态性的方法,它们工作得很好。

template <typename servicetype> class Service {
public:
        std::string& service_type() { return static_cast<servicetype*>(this)->service_type_impl(); }

};

class ServiceType1 : public Service<ServiceType1> {
public:
    ServiceType1() :service_type_("Service Type 1") {}
    std::string& service_type_impl() { return service_type_; }
private:
    std::string&& service_type_;
}; 

class ServiceType2 : public Service<ServiceType2> {
public:
    ServiceType2() :service_type_("Service Type 2") {}
    std::string& service_type_impl() { return service_type_; }
private:
    std::string&& service_type_;
}; 

template <typename T>
class Server
{
public:
    void print() {
        std::cout << service_.service_type()<<std::endl;
    }

    Service<T> service_;
}; 

 
int main()
{

    Server<ServiceType1> service_type1;
    Server<ServiceType2> service_type2;

    service_type1.print();
    service_type2.print();

}
c++ crtp static-polymorphism
1个回答
0
投票

您永远不会构造实现类 ServiceType1ServiceType2 的对象。

您仅构造 Server 和 Service 类对象。

© www.soinside.com 2019 - 2024. All rights reserved.