Có một kỹ thuật đôi khi tôi sử dụng khi trọng template
chức năng mà đi như thế này:Rỗng eni gói enums - họ làm cho hai chức năng khác nhau?
#include <utility>
template<int> struct unique_enum { enum class type {}; };
template<int index> using UniqueEnum = typename unique_enum<index>::type;
template<bool b, int index=1>
using EnableFuncIf = typename std::enable_if< b, UniqueEnum<index> >::type;
template<bool b, int index=1>
using DisableFuncIf = EnableFuncIf<!b, -index>;
// boring traits class:
template<typename T>
struct is_int : std::false_type {};
template<>
struct is_int<int> : std::true_type {};
#include <iostream>
// use empty variardic packs to give these two SFINAE functions different signatures:
template<typename C, EnableFuncIf< is_int<C>::value >...>
void do_stuff() {
std::cout << "int!\n";
}
template<typename C, DisableFuncIf< is_int<C>::value >...>
void do_stuff() {
std::cout << "not int!\n";
}
int main() {
do_stuff<int>();
do_stuff<double>();
}
này phân biệt do_stuff
từ do_stuff
, bởi vì một mất 0 hoặc nhiều UniqueEnum<1>
s, và người kia có 0 hoặc nhiều UniqueEnum<-1>
s. gcc 4.8 xem xét các gói rỗng khác nhau này để phân biệt.
Tuy nhiên, trong phiên bản mới nhất của clang tôi đã thử, điều này không thành công: nó xử lý hàm với 0 UniqueEnum<1>
s giống như hàm 0 UniqueEnum<-1>
s.
Có cách giải quyết dễ dàng trong công việc, nhưng tôi tự hỏi nếu kỹ thuật trên của tôi là hợp pháp - làm hai chức năng template
s, mà chỉ khác nhau bởi gói tham số biến trống rỗng, thực sự khác nhau?
Điều này chỉ áp dụng khi chúng tôi chỉ định đối số một cách rõ ràng và không suy luận ra nó? (ví dụ, tôi đã thực hiện các chức năng có 'T const &', sau đó thông qua '7' cho nó, các trick không còn hợp pháp?) – Yakk
@Yakk: Trong trường hợp đó tôi không chắc chắn chính xác, nhưng tôi đã đọc thông qua toàn bộ 14.8.2 nhiều lần và dường như với tôi, Tiêu chuẩn không chỉ rõ hành vi nên là gì –