繁体   English   中英

C ++简化构造函数重载

[英]C++ simplify constructor overloads

说我正在做一个班级client 我希望client能够使用以下类型构造:

client(const boost::network::uri::uri &, const boost::network::uri::uri &)
client(const std::string &, const std::string &)
client(const char *, const char *)

但是...我也希望所有排列...

client(const boost::network::uri::uri &, const boost::network::uri::uri &)
client(const std::string &, const std::string &)
client(const char * &, const char * &)
client(const boost::network::uri::uri &, const std::string &)
client(const std::string &, const boost::network::uri::uri &)
client(const boost::network::uri::uri &, const char * &)
client(const char * &, const boost::network::uri::uri &)
client(const std::string &, const char * &)
client(const char * &, const std::string &)

可以假定,为简单起见,我的客户端类如下所示。

#include <string>
#include <boost/network.hpp>

#define HOST_URI "..."
#define AUTH_URI HOST_URI"..."

namespace bn = boost::network;

class client
{

private:

  const bn::uri::uri host_;

  const bn::uri::uri auth_;

public:

  client(const bn::uri::uri & host = const bn::uri::uri(HOST_URI),
         const bn::uri::uri & auth = const bn::uri::uri(AUTH_URI));

  client(const std::string & host = const std::string(HOST_URI),
         const std::string & auth = const std::string(AUTH_URI));

  client(const char * & host = HOST_URI,
         const char * & auth = AUTH_URI);

  client(const bn::uri::uri & host = const bn::uri::uri(HOST_URI),
         const std::string & auth = const std::string(AUTH_URI));

  client(const std::string & host = const std::string(HOST_URI),
         const bn::uri::uri & auth = const bn::uri::uri(AUTH_URI));

  client(const bn::uri::uri & host = const bn::uri::uri(HOST_URI),
         const char * & auth = AUTH_URI);

  client(const char * & host = HOST_URI,
         const bn::uri::uri & auth = const bn::uri::uri(AUTH_URI));

  client(const std::string && host = const std::string(HOST_URI),
         const char * & auth = AUTH_URI);

  client(const char * & host = HOST_URI,
         const std::string && auth = const std::string(AUTH_URI));

};

当前定义为:

#include <string>
#include <boost/network.hpp>

namespace bn = boost::network;

client::client(const bn::uri::uri & host,
               const bn::uri::uri & auth)
: host_(host), auth_(auth)
{
    ...
};

client::client(const std::string & host,
               const std::string & auth)
: client(bn::uri::uri(host), bn::uri::uri(auth)){}

client::client(const char * & host,
               const char * & auth)
: client(bn::uri::uri(host), bn::uri::uri(auth)){}

client::client(const bn::uri::uri & host,
               const std::string & auth)
: client(host, bn::uri::uri(auth)){}

client::client(const std::string & host,
               const bn::uri::uri & auth)
: client(bn::uri::uri(host), auth){}

client::client(const bn::uri::uri & host,
               const char * & auth)
: client(host, bn::uri::uri(auth)){}

client::client(const char * & host,
               const bn::uri::uri & auth)
: client(bn::uri::uri(host), auth){}

client::client(const std::string & host,
               const char * & auth)
: client(bn::uri::uri(host), bn::uri::uri(auth)){}

client::client(const char * & host,
               const std::string & auth)
: client(bn::uri::uri(host), bn::uri::uri(auth)){}

所以我的问题是,这样做的正确和简便方法是什么? 当然,这次我手动完成了所有排列,但是将来我可以使用3个以上的变量进行排列,这将变得很丑,很快。

由于uri定义了可以采用string以及const char *构造const char * ,因此请消除其参数不包括uri类型的构造函数。 这样, 用户定义的uri转换就可以为您隐式转换这些类型。

#define HOST_URI "..."
#define AUTH_URI HOST_URI"..."

class client
{
private:
  uri host_;

  uri auth_;

public:
  client(const uri & host = uri(HOST_URI),
         const uri & auth = uri(AUTH_URI));

  client(const char * host = HOST_URI,
         const char * auth = AUTH_URI);
};

--

client::client(const uri::uri & host,
               const uri::uri & auth)
: host_(host), auth_(auth)
{
    ...
};

client::client(const char * host,
               const char * auth)
: client(uri::uri(host), uri::uri(auth)){}

“如何将它专门委派给该构造函数?” 使用委派构造函数时要明确。

client(const char * && host, const char * && auth) :
             client(uri(host), uri(auth)){}

要么

client(const char * && host, const char * && auth) :
             client(string(host), string(auth)){}

模板如何:

#include <type_traits>

class client
{
    uri host_;
    uri auth_;

public:
    template <typename U, typename V,
              typename = typename std::enable_if<
                  std::is_constructible<uri, U&&>::value &&
                  std::is_constructible<uri, V&&>::value>::type>
    client(U && u, V && v)
    : host_(std::forward<U>(u))
    , auth_(std::forward<V>(v))
    { }

    // ...
};

您可以创建一个类,该类可以将所有这三件事作为参数。 您的帖子没有包含足够的详细信息让我写具体答案,但这是伪代码:

struct input_helper
{
    input_helper(uri &u);
    input_helper(string &u);
    input_helper(char *u);

    // data members to hold the inputs, maybe other processing to bring them to a common type
};

// the constructor
client(input_helper host, input_helper auth);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM