2013-07-06 25 views
1

我試圖用於在編譯時測試某些propierties(type_trait)variadics模板,但看來下面的代碼不能編譯C++ 11 constexpr可變參數邏輯表達式

template<typename test> 
constexpr bool trait_test(){ 
    return test::value; 
} 

template<typename test, typename... Others> 
constexpr bool trait_test(){ 
    return test::value&&trait_test<Others...>(); 
} 

template<typename A, typename... Deriveds> 
constexpr bool commonBaseClass{ 
    return trait_test<std::is_base_of<A,Deriveds>...>(); 
} 

這個問題似乎是當「其他」具有爲0的lenght有2個可能的呼叫

trait_test<typename test> 
trait_test<typename test, typename... Others={}> 

和編譯器不知道至極一個偷看。我當然想偷看第一個(並保持一切constexpr)

+1

下次請在您的問題中包含http://sscce.org。這使得其他人更容易測試您的代碼。 – Xeo

回答

3

的最小變化讓你的代碼編譯將用來替換你的第二個test_trait超載:

template<typename T0, typename T1, typename... Others> 
constexpr bool trait_test(){ 
    return T0::value&&trait_test<T1, Others...>(); 
} 

這意味着1個參數匹配的第一個,和2個或更多匹配第二。

+0

mmm T0不計算,所以我必須傳遞虛擬類型,但如果我這樣做的話,當我打電話給時,結果如下: T1 :: value && T1 :: value,所以T1得到兩次評估,在這種情況下很好,因爲False && False = False且TRue && True = True,但不適用於其他情況(例如,如果&&被替換爲「xor」),因爲如果A xor 1 = 1,那麼A xor 1 xor 1 = 0也不適用於大多數情況下沒有「constexpr」。 – GameDeveloper

+1

@darioOO typo fixed。 – Yakk

+0

Should accept現在這個答案,其他答案不會在VS 2013上編譯所以這個是「更便攜」的。 – GameDeveloper

2

事實上,這是不明確的。接受一個模板參數的函數模板並不比接受一個或多個模板參數的函數模板更具體,因爲函數模板的部分排序是在參數函數參數上完成的 - 並且這兩個函數模板都有零函數參數。

如果我可以建議另一種方法:

#include <type_traits> 

template<typename... Ts> 
struct all_of; 

template<typename T> 
struct all_of<T> : std::integral_constant<bool, T::value> { }; 

template<typename T, typename... Ts> 
struct all_of<T, Ts...> : std::integral_constant<bool, 
    T::value && all_of<Ts...>::value> { }; 

template<typename A, typename... Deriveds> 
constexpr bool commonBaseClass() 
{ 
    return all_of<std::is_base_of<A, Deriveds>...>(); 
} 

你會然後用你的commonBaseClass()這樣:

struct X { }; 
struct Y : X { }; 
struct Z : X { }; 

int main() 
{ 
    static_assert(commonBaseClass<X, Y, Z>(), "!"); 
} 

這裏是一個live example

+0

該死的我必須深刻理解積分常數,第二次我看到它..謝謝你希望它的作品! – GameDeveloper

+2

@DarioOO:不客氣。是的,'integral_constant'並不是所有最直觀的事情,但事實上,如果你有一點點玩法,就很難獲得直覺。它基本上是一個帶有一個靜態'value'數據成員的整型常量類型的結構體(例如'integral_constant '歸結爲'struct X {static constexpr bool value = V;/* ..一些其他有用的東西。 .. * /}'(參見[這裏](http://en.cppreference.com/w/cpp/types/integral_constant)以供參考) –