Đây là một đoạn mã mà tôi sẽ sử dụng để kiểm tra xem các loại mẫu variadic là duy nhất:Làm cách nào để có thể làm cho mã mẫu Phiên bản ngắn hơn này sử dụng các tính năng từ C++ 14 và C++ 1z?
template <typename...>
struct is_one_of;
template <typename F>
struct is_one_of<F> {
static constexpr bool value = false;
};
template <typename F, typename S, typename... T>
struct is_one_of<F, S, T...> {
static constexpr bool value =
std::is_same<F, S>::value || is_one_of<F, T...>::value;
};
template <typename...>
struct is_unique;
template <>
struct is_unique<> {
static constexpr bool value = true;
};
template <typename F, typename... T>
struct is_unique<F, T...> {
static constexpr bool value =
is_unique<T...>::value && !is_one_of<F, T...>::value;
};
int main() {
constexpr bool b = is_unique<bool, int, double>::value;
constexpr bool c = is_unique<int, char, int>::value;
static_assert(b == true && c == false, "!");
}
Có cách nào để làm cho mã này ngắn hơn và/hoặc ngắn gọn hơn sử dụng các tính năng được giới thiệu trong C++ 14 và C++ 1z? Hoặc có cách nào tốt hơn để đạt được hiệu quả tương tự bằng cách sử dụng các tính năng mới không?
Trong trường hợp của C++ 1z tôi có nghĩa là: các tính năng đã có sẵn trong các phiên bản mới nhất của Clang và GCC.
Không, điều đó khá súc tích như vậy. Tuy nhiên, khi biểu thức gấp được giới thiệu, bạn sẽ có thể thực hiện một số việc như: 'constexpr giá trị bool tĩnh = std :: is_same :: giá trị || ... ' –
@BrianRodriguez: Điều đó cần ngoặc tròn tôi nghĩ. –
Bạn có thể sử dụng một mẹo nhỏ để làm cho 'is_one_of' ngắn gọn hơn một chút: http://coliru.stacked-crooked.com/a/3b9755f28193a13b – melak47