Maalesef ++ g kullanıyorum
P.S., ben daha basit olurdu bir süre düşündü. Bu yüzden burada eksiksiz bir çözüm sunmaya çalışacağım.
taşıyıcılığının
: Genel yaklaşım sorunların bu tür bir
özellikleri yardımcı şablonu yazmak ve bir sınıf ihtisas karar vermek (C++ 11, boost veya manuel uygulama ya)
enable_if
ile birlikte kullanmaktır çözmek için ,
template <typename T>
struct has_nested_Vec {
typedef char yes;
typedef char (&no)[2];
template <typename U>
static yes test(typename U::Vec* p);
template <typename U>
static no test(...);
static const bool value = sizeof(test<T>(0)) == sizeof(yes);
};
yaklaşım basittir iki şablon işlevleri, farklı boyutlarda olduğu dönüş türlerini sağlar: yazmaya
basit bir yaklaşım, mutlaka iyi ama basit olurdu. Bunlardan biri yuvalanmış Vec
tipini ve diğerini elips alır. İç içe geçmiş Vec
olan tüm bu türler için, ilk aşırı yük daha iyi eşleşir (elips her tür için en kötü eştir). İç içe geçmiş Vec
SFINAE içermeyen tipler için bu aşırı yük atılır ve tek seçenek elips sayılır. Yani şimdi herhangi bir türün iç içe geçmiş Vec
türüne sahip olup olmadığını sormak için bir özellik var.
herhangi kitaplıktan kullanabilirsiniz eğer
etkinleştirme, veya kendi dönebilirsiniz, oldukça basittir:
template <bool state, typename T = void>
struct enable_if {};
template <typename T>
struct enable_if<true,T> {
typedef T type;
};
İlk argüman false
olduğunu baz şablon Tek seçenek ve iç içe type
, koşul true
ise, enable_if
, SFINAE ile kullanabileceğimiz bir iç içe type
sahiptir.
Uygulama
Şimdi şablonu hem de iç içe Vec
ile sadece bu tipleri için SFINAE kullanacak ihtisas sağlamanız gerekir: Biz bir tip Functor
örneğini zaman
template<class T, class V = void>
struct Functor {
void operator()() const {
std::cerr << "general" << std::endl;
}
};
template<class T>
struct Functor<T, typename enable_if<has_nested_Vec<T>::value>::type > {
void operator()() const {
std::cerr << "special" << std::endl;
}
};
, derleyici, has_nested_Vec
örneğini başlatacak ve enable_if
'a geçirilen bir gerçek değer elde edecek olan uzmanlığı kullanmaya çalışacaktır. Değer false
olan enable_if
iç içe type
türünde olmayan türler için, bu nedenle SFINAE'de uzmanlık atılacak ve temel şablon kullanılacak.
Sizin özel bir durum gerçekten sen misin yok, tek birine üç unsuru karıştırabilirsiniz bütün tip ama sadece operatörü uzmanlaşmak gerekir görünüyor belirli durumda,
: Bir Bu eski bir soru olsa da
template <typename T>
class Functor {
template <typename U>
void op_impl(typename U::Vec* p) const {
std::cout << "specialized";
}
template <typename U>
void op_impl(...) const {
std::cout << "general";
}
public:
void operator()() const {
op_impl<T>(0);
}
};
'derleyici 'etiketini kaldırıldı, genellikle derleme işleminin kendisi hakkında soru sormak için kullanılır, oysa bu soru C++ dili hakkındadır. –