Ben (https://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Member_Detector buradan) Bu sınıfın fikrini almak olduğunu düşündüm:Üye Detektörü geri dönüşü neden int olmalı?
template<typename T>
class DetectX
{
struct Fallback { int X; }; // add member name "X"
struct Derived : T, Fallback { };
template<typename U, U> struct Check;
typedef char ArrayOfOne[1]; // typedef for an array of size one.
typedef char ArrayOfTwo[2]; // typedef for an array of size two.
template<typename U>
static ArrayOfOne & func(Check<int Fallback::*, &U::X> *);
template<typename U>
static ArrayOfTwo & func(...);
public:
typedef DetectX type;
enum { value = sizeof(func<Derived>(0)) == 2 };
};
ama ben bir üye double MyTest
arıyordu hangi benim durumumda uyarlamak için çalıştı.
struct Fallback { double MyTest; };
için
struct Fallback { int X; }; // add member name "X"
ama dedektör bakılmaksızın bir MyTest üyesi vardı olmadığını tüm sınıfları için "doğru" dönüyordu: Ben bu çizgiyi değiştirdi. Satırı şu şekilde değiştirdim:
ve beklendiği gibi çalıştı.
Geri dönüşün neden gerçekte aradığınız üyenin türü değil, int olması gerektiğini anlatabilir misiniz?
#include <iostream>
#include <vector>
// https://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Member_Detector
// Standard point representation
struct Point3
{
double X,Y,Z;
};
struct SomethingElse{};
template<typename T>
class DetectX
{
struct Fallback { int X; }; // add member named "X"
struct Derived : T, Fallback { };
template<typename U, U> struct Check;
typedef char ArrayOfOne[1]; // typedef for an array of size one.
typedef char ArrayOfTwo[2]; // typedef for an array of size two.
template<typename U>
static ArrayOfOne & func(Check<int Fallback::*, &U::X> *);
template<typename U>
static ArrayOfTwo & func(...);
public:
typedef DetectX type;
enum { value = sizeof(func<Derived>(0)) == 2 };
};
template<typename T>
class DetectY
{
struct Fallback { double Y; }; // add member named "Y"
struct Derived : T, Fallback { };
template<typename U, U> struct Check;
typedef char ArrayOfOne[1]; // typedef for an array of size one.
typedef char ArrayOfTwo[2]; // typedef for an array of size two.
template<typename U>
static ArrayOfOne & func(Check<double Fallback::*, &U::X> *);
template<typename U>
static ArrayOfTwo & func(...);
public:
typedef DetectY type;
enum { value = sizeof(func<Derived>(0)) == 2 };
};
int main()
{
std::cout << DetectX<Point3>::value << " " << DetectX<SomethingElse>::value << std::endl;
std::cout << DetectY<Point3>::value << " " << DetectY<SomethingElse>::value << std::endl;
return 0;
}
Benim çıkışı:
Şimdi, bunun hangi türden olduğu önemli olmamasını sağladım, ancak yine de 'double' ile çalışmıyor gibi görünüyor (son düzenlememdeki örneğime bakın). –
@DavidDoria Çünkü '& U :: Y' olması gereken' & U :: X' var. – Barry
Wow, demek istediğim, derleyicimin ne istediğimi bilmesi için doğru olanı yazmam gerek !? Gürültü için üzgünüm ... –