考慮這個類和可變引數成員函式:
class foo
{
public:
template<class C, class... Cs>
void add(C&& c, Cs&&... cs)
{
...
add(cs...);
}
private:
void add(){ }
};
有沒有辦法將add終止遞回的空多載放置在另一個范圍內?請忽略這通常是否是一個好主意,我嚴格詢問如何做到這一點,如果有的話。我想將它放在一個impl命名空間中,如下所示:
namespace impl
{
void add() {}
}
class foo
{
public:
template<class C, class... Cs>
void add(C&& c, Cs&&... cs)
{
...
using namespace impl;
add(cs...);
}
};
但是上面的代碼在初始化時不起作用。編譯器抱怨add當引數包為空時它找不到匹配的函式呼叫。
有沒有辦法使用一些范圍黑客來實作這一目標?
uj5u.com熱心網友回復:
如何使用if constexpr:
namespace impl { void add() {} }
class foo {
public:
template<class C, class... Cs>
void add(C&& c, Cs&&... cs)
{
if constexpr (sizeof...(Cs) == 0)
impl::add();
else
add(cs...);
}
};
uj5u.com熱心網友回復:
你可以這樣做:
class foo_impl
{
protected:
void add() {}
};
class foo : private foo_impl
{
using foo_impl::add;
public:
template<class C, class... Cs>
void add(C&& c, Cs&&... cs)
{
add(cs...);
}
};
如果foo_impl放置在單獨的命名空間中,這也將起作用。
但是,您不能將其add()作為免費功能使用。語言中成員函式和自由函式可以屬于同一個多載集的唯一背景關系是在多載運算子查找期間。這是因為名稱查找規則以及多載決議只能在名稱查找之后發生的事實,并且只能在該名稱查找找到的函式集上進行。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/401079.html
