Tôi sử dụng rất nhiều mẫu và đôi khi rất khó để tìm ra mọi thứ thực sự là gì. Tôi muốn viết một tiện ích để cho tôi một cái tên đẹp, xinh xắn cho mọi kiểu - typeid() không cắt nó. Ví dụ, nếu tôi chỉ có một vector<int>
, gcc.4.6.4 trên hộp của tôi tạo ra sau với typeid:Có thể lấy mẫu trên các loại HOẶC không phải loại không?
St6vectorIiSaIiEE
trong khi tôi tưởng muốn
std::vector<
int,
std::allocator<
int
>
>
Tôi đã viết một cái gì đó mà sẽ làm việc với bất kỳ loại hay mẫu trên các loại, nhưng chỉ cung cấp hai mẫu:
template <typename T> struct simple_type_name;
template <template <typename....> class T> struct template_type_name;
nào khi chuyên về int
hay std::vector
c giúp tôi xây dựng các chuỗi tôi muốn. Tôi cũng có một chuyên môn một phần của simple_type_name
chỉ trên bất kỳ Base<Args...>
để đi qua tất cả các arg và làm mọi thứ khi thích hợp. Điều này làm việc hoàn toàn tốt đẹp cho int
và vector<int>
và thực sự bất kỳ công cụ mẫu tùy ý phức tạp ... miễn là tất cả các mẫu là loại.
Nếu nó giúp, tôi phiên bản "đầy đủ mẫu" trông như thế này:
template <template <typename...> class Base, typename... Args>
struct simple_type_name<Base<Args...>>
{
static std::string name(int indent = 0) {
std::string base = template_type_name<Base>::name(indent);
std::string args[] = { simple_type_name<Args>::name(indent + 4)... } ;
// basic string putting together stuff here that is less interesting
}
};
Câu hỏi là: làm thế nào để tôi làm những gì tôi đã làm việc cho, nói, std::array<int, 10>
? Tôi không biết cách xử lý các tham số không kiểu. Điều này thậm chí có thể?
"Tôi sử dụng rất nhiều mẫu và đôi khi rất khó để tìm ra mọi thứ thực sự là gì." Tôi yêu C++ –
Tôi nhớ rằng phải có một chức năng có sẵn (ít nhất là đối với GCC) có thể phá vỡ tên 'typeid() .' cho bạn. –
Bạn đã thử sử dụng 'C++ filt' để bỏ ẩn tên không? – greatwolf