2017-10-20 107 views
0

有人可以解釋爲什麼這個靜態斷言是錯誤的嗎?如何重新定義is_empty,使其按照我希望的方式工作(不更改語法)?一種類型不是我想在默認情況下評估爲false的包(例如,is_empty<int>::value應爲false)。確定一個包是否爲空

#include <type_traits> 
template <typename Pack> struct is_empty : std::false_type {}; 

template <typename T, template <T...> class Z, T... Is> 
struct is_empty<Z<Is...>> : std::true_type {}; 

template <typename T, template <T...> class Z, T First, T... Rest> 
struct is_empty<Z<First, Rest...>> : std::false_type {}; 

template <int...> struct Z; 

int main() { 
    static_assert(is_empty<Z<>>::value); 
} 

回答

2

的問題是包含在Z類型T不能被推導出來。

作品,如果你明確它,我不知道如何避免明確。

#include <type_traits> 

template <typename...> 
struct is_empty : std::false_type 
{ }; 

template <typename T, template <T...> class Z, T... Is> 
struct is_empty<T, Z<Is...>> : std::true_type 
{ }; 

template <typename T, template <T...> class Z, T First, T... Rest> 
struct is_empty<T, Z<First, Rest...>> : std::false_type 
{ }; 

template <int...> struct Z; 

int main() { 
    static_assert(is_empty<int, Z<>>::value, "!"); 
} 

- 編輯 -

工作,如果你Z需要第一個參數類型(在std::integer_sequence的樣子);以這種方式演繹作品

#include <type_traits> 

template <typename> 
struct is_empty : std::false_type 
{ }; 

template <typename T, template <typename U, U...> class Z, T... Is> 
struct is_empty<Z<T, Is...>> 
    : std::integral_constant<bool, sizeof...(Is) == 0U> 
{ }; 

template <typename T, T ...> 
struct X 
{ }; 

template <int ... Is> 
using Y = X<int>; 

int main() 
{ 
    static_assert(is_empty<X<int>>::value, "!"); 
    static_assert(is_empty<Y<>>::value, "!"); 
} 

- EDIT 2 -

在C++ 17件作品與auto

#include <type_traits> 

template <typename Pack> 
struct is_empty : std::false_type 
{ }; 

template <template <auto...> class Z, auto... Is> 
struct is_empty<Z<Is...>> : std::bool_constant<sizeof...(Is) == 0U> 
{ }; 

template <int...> 
struct X; 

int main() 
{ 
    static_assert(true == is_empty<X<>>::value); 
    static_assert(false == is_empty<X<1>>::value); 
    static_assert(false == is_empty<int>::value); 
} 
+0

是的,那是我的備用解決方案,我需要避免。所以沒有辦法維護我的語法? – prestokeys

+0

@prestokeys - 據我所知,沒有。但我不是專家,有人比我更能找到解決方案。也許用C++ 17應該是可能的(但是你標記了C++ 11),但是我也沒有用它。 – max66

+0

@prestokeys - 回答有點改進,但​​不完全是你問的 – max66

7

你爲什麼這樣做呢?

你可以做sizeof...(args)來確定參數組的長度。如果是0,那麼它是空的:

#include <iostream> 

template<typename... Args> 
void func(Args... args) 
{ 
    std::cout<<(sizeof...(args)); 
} 

int main() { 

    func(1, 2, 3); 
    func(); 
    func(1); 
    func(1, 2); 
    func(1, 2, 3, 4); 

    return 0; 
} 
+0

@布蘭登我需要它在編譯時進行評估。但你確實給了我一些想法。 – prestokeys

+0

是什麼讓你認爲'sizeof ...'在編譯時不會被忽略?就像普通的'sizeof'一樣。所以,你可以用更簡單的方式創建特徵模板。 –

+0

@prestokeys'sizeof ...'是編譯時間。你可以在'static_assert'或其他模板中使用它。正確.. + 1。http://en.cppreference.com/w/cpp/language/parameter_pack#The_sizeof..._operator – Brandon

相關問題