2016-04-30 79 views
-1

我有一個EntityComponent-System,並且有一個組件應該調用各種其他組件。對於這個例子,我選擇了一個布爾函數結果的簡單組合。C++ Template Variadic - 爲每個模板參數調用一次成員函數

ResultCombinerComponent具有可變參數模板參數,並且對於這些參數中的每一個參數,都應按照給定模板參數的順序調用函數。順序非常重要。

之後將函數調用的結果合併。

在下面的代碼我剛剛更換的部件,我不知道如何實現與僞C++

template<typename... Args> 
class ResultCombinerComponent 
{ 
    template<typename T> 
    bool calcSingleResult() 
    { 
     return getComponent<T>()->calcResult(); 
    } 

    bool calcResult() 
    { 
     bool result = true; 
     for (int i = 0; i < sizeof...(Args); i++) // doesn't work 
     { 
      if (!calcSingleResult<Args(i)>() // doesn't work 
      { 
       result = false; 
       break; 
      } 
     } 
     return result; 
    } 

} 


class A 
{ 
    bool calcResult(); 
} 
class B 
{ 
    bool calcResult(); 
} 
class C 
{ 
    bool calcResult(); 
} 
+0

[這](http://stackoverflow.com/questions/12030538/calling-a-function-for-each-variadic-template-argument -和-一個數組)可以給你一些信息。 – LogicStuff

+0

我已閱讀過這個帖子和其他許多類似帖子,並試圖將其應用於我的特定問題,但無法將其應用於我的特定問題。 – keyboard

+0

你沒有在任何地方使用'...'(參數包擴展)。還有一件事 - 你想用所提供的類型來計算一些東西? ...因爲代碼中沒有實際的實例/對象。 – LogicStuff

回答

2

在C++ 1Z,你可以這樣做:

bool calcResult() 
{ 
    return (calcSingleResult<Args>() && ...); 
} 

在C + + 11,你必須有其他的方法:

template <typename T> 
bool calcImpl() 
{ 
    return calcSingleResult<T>(); 
} 

template <typename T, typename T2, typename...Ts> 
bool calcImpl() 
{ 
    return calcSingleResult<T>() && calcImpl<T2, Ts...>(); 
} 

bool calcResult() 
{ 
    return calcImpl<Args...>(); 
} 
+0

謝謝,這個作品就像一個魅力! – keyboard

相關問題