考慮到下面這段代碼的條件:編譯時間調度:在有效的呼叫
template<typename GroupA, typename GroupB>
class JoinedObjectGroup
: public _ObjectSpaceHolder<GroupA>
, public _ObjectSpaceHolder<GroupB>
{
public:
JoinedObjectGroup(GroupA &groupA, GroupB &groupB)
: _ObjectSpaceHolder<GroupA>(groupA)
, _ObjectSpaceHolder<GroupB>(groupB)
{
}
template<typename ObjectType>
ObjectType get()
{
// Dispatch to appropriate handler: only one of the following actually compiles as
// either GroupA knows about ObjectType or GroupB, but not both. So:
//
// return static_cast<_ObjectSpaceHolder<GroupA> &>(*this).m_objectSpace.get<ObjectType>();
// or
// return static_cast<_ObjectSpaceHolder<GroupB> &>(*this).m_objectSpace.get<ObjectType>();
}
};
在get()
電話,我想進行編譯時分派到相應的處理。基本想法是ObjectType
通過GroupA
或GroupB
已知。我最初的做法是以下幾點:
template<typename ObjectType>
ObjectType get()
{
return Dispatch<ObjectType, GroupA, GroupB>::get(*this);
}
有:
template<typename ObjectType, typename GroupA, typename GroupB, typename = void>
struct Dispatch;
template<typename ObjectType, typename GroupA, typename GroupB>
struct Dispatch<ObjectType, GroupA, GroupB, typename std::enable_if<std::is_same<ObjectType, decltype(std::declval<GroupA>().template get<ObjectType>())>::value>::type>
{
template<typename JoinedGroup>
static
ObjectType get(JoinedGroup &joinedGroup)
{
return static_cast<_ObjectSpaceHolder<GroupA> &>(joinedGroup).m_objectSpace.get<ObjectType>();
}
};
template<typename ObjectType, typename GroupA, typename GroupB>
struct Dispatch<ObjectType, GroupA, GroupB, typename std::enable_if<std::is_same<ObjectType, decltype(std::declval<GroupB>().template get<ObjectType>())>::value>::type>
{
template<typename JoinedGroup>
static
ObjectType get(JoinedGroup &joinedGroup)
{
return static_cast<_ObjectSpaceHolder<GroupB> &>(joinedGroup).m_objectSpace.get<ObjectType>();
}
};
我本以爲這會工作以爲的enable_if
的is_same
從句中代替ObjectType
會導致其中的一個表達式失敗並因此而離開只有一個有效的專業化。然而,模棱兩可的名字和重新定義的錯誤證明了我的錯誤。
爲什麼我的推理不正確?我該如何恰當地派遣電話呢?
@JoachimPileborg:謝謝,這是簡化名稱時引入的拼寫錯誤。修正了這個 – OnMyLittleDuck
還要注意'_ObjectSpaceHolder'是爲編譯器保留的(以及所有以下劃線開頭的名字 - 大寫字母)。 –
我想在上面的假設是隻有一個'模板 T GroupA ::得到()'和'模板 T GroupB ::得到()'存在 - 是否肯定是真的? –
Smeeheey