调用基类构造函数而不命名其类

时间:2016-09-09 13:48:28

标签: c++ c++11 c++14

try
{
    $result = $client->shoppingCartCouponAdd($session, $quoteId, 'test123',$storeId);
    echo "<br>Apply discount code: ";
    var_dump($result);
}
catch(Exception $ex)
{
    echo "<br>Discount code Failed: " . $ex->getMessage();
}

有没有办法在没有编写全名的情况下调用基础构造函数并且没有对其进行类型化?

原因显然是避免代码重复,并在基类模板params中的细节发生变化时引入多个位置进行更改。

第2级:

class MyDerived: public Incredble<Difficult< And<Complicated, Long>>, And<Even, Longer>, BaseClass, Name>
{
public:
  MyDerived();
}


MyDerived::MyDerived
: ???(params)
{}

2 个答案:

答案 0 :(得分:7)

您可以使用injected-class-nameIncredible<...>::Incredible引用自身,并且由于MyDerived不是类模板,因此非限定查找将查看其基类的范围:

MyDerived::MyDerived
: Incredble(params)
{}

如果Incredible依赖名称,那么您需要对其进行限定。实际上,您可以简单地使用派生类型名称来限定基类 inject-class-name (h / t Johannes Schaub-litb):

MyDerived::MyDerived
: MyDerived::Incredible(params)
{}

这适用于所有情况。

答案 1 :(得分:0)

如果您不习惯使用usingtypedef来避免“污染封闭的命名空间”,则可以在类/结构中使用using

一个例子

#include <map>

template <typename ...>
class foo
 {};

struct A : public foo<int, std::tuple<long, char, std::map<std::string, int>>>
 {
   using base_t = foo<int, std::tuple<long, char, std::map<std::string, int>>>;

   A () : base_t{}
    { };
 };

int main()
 { }