2017-11-30 13 views
0

私は頭が折れないような問題があります。 Iは、(後にラムダが使用する)コールバックのための2つのタイプの定義を有する:特定のタイプのテンプレートの引数のみを配列に追加します

Payload1とPayload2イベントペイロードデータを含む異なる構造体であるよう
typedef std::function<void(Payload1 Payload)> Callback1; 
typedef std::function<void(Payload2 Payload)> Callback2; 

TArray<Callback1> Callback1Array; 
TArray<Callback2> Callback2Array; 

そして、それが収まる配列にコールバックを追加する必要があり、テンプレート機能:それから私は、コールバックを含む2つのアレイを(私が使用しているとして、それらはTArraysあるが、それは問題ではありません)、得ましたin:

template<typename CallbackType> 
void SubscribeToEvent(CallbackType Callback) 
{ 
    // If CallbackType is Callback1 
    Callback1Array.Add(Callback); 

    // Else If CallbackType is Callback2 
    Callback2Array.Add(Callback); 
} 

私がコメントに書いたステートメントをどのように表現できるかわかりません。 Callback1配列にCallback2型を追加しようとすると明らかに失敗するので、型をチェックして適切な配列に追加するだけで、他の型にも追加しようとはしません。これは可能ですか?

ありがとうございました:)

+0

てください[MCVE] –

+0

@PasserByがこの書き込み作業が必要allthough、それは:)私のフレームワークは、より読みやすくなり、より良い1つの:) – iRedCraft

答えて

1

をグロスの悪用のように見えるif constexpr

これは通常、テンプレートを使用する代わりにSubscribeToEventをオーバーロードする場所です。

void SubscribeToEvent(Callback1 Callback) 
{ 
    Callback1Array.Add(Callback); 
} 

void SubscribeToEvent(Callback2 Callback) 
{ 
    Callback2Array.Add(Callback); 
} 
+0

おかげにスレッドを変更しました – iRedCraft

1

std::tupleを使用すると、ような何かがあります。直接質問に答えるために、あなたあなたが

template<typename CallbackType> 
void SubscribeToEvent(CallbackType Callback) 
{ 
    if constexpr(std::is_same_v<CallbackType, Callback1>) 
     Callback1Array.Add(Callback); 

    if constexpr(std::is_same_v<CallbackType, Callback2>) 
     Callback2Array.Add(Callback); 
} 

しかし、それをコメントし何を書くことができ

template <typename ... Ts> 
class Foo 
{ 
public: 
    template <typename T> 
    using Callback = std::function<void(T)>; 

    template <typename T> 
    using EventArray = TArray<Callback<T>>; 


    template <typename T> 
    void SubscribeEvent(Callback<T> callback) 
    { 
     GetCallbackArray<T>().Add(callback); 
    } 

private: 
    template <typename T> 
    EventArray<T>& GetCallbackArray() { return std::get<EventArray<T>>(eventCallbacks); } 

private: 
    std::tuple<EventArray<Ts>...> eventCallbacks; 
}; 

using MyClass = Foo<FRpcEventPayload_Ready /*, ...*/>; 
関連する問題