मैं संकलन-समय पर जांचना चाहता हूं यदि उपयोगकर्ता शाब्दिक _name
Ret
प्रकार और तर्क Arg
के लिए परिभाषित किया गया है। जब मैं आधा समाधान है, यह शाब्दिक operator
की आवश्यकता कम से कम एक बार में परिभाषित किया जा करने के लिए:क्या यह जांचना संभव है कि उपयोगकर्ता शब्द को दिए गए प्रकार और तर्क के लिए परिभाषित किया गया है या नहीं?
#include <iostream>
#include <type_traits>
struct one { };
struct two { };
// we need at least one of these definitions for template below to compile
one operator"" _x(char const*) {return {};}
two operator"" _x(unsigned long long int) {return {};}
template<class T, class S, class = void>
struct has_literal_x : std::false_type
{ };
template<class T, class S>
struct has_literal_x <T, S,
std::void_t<decltype((T(*)(S))(operator"" _x))>
> : std::true_type
{ };
int main()
{
std::cout << has_literal_x<one, char const*>::value << std::endl;
std::cout << has_literal_x<two, unsigned long long int>::value << std::endl;
std::cout << has_literal_x<one, unsigned long long int>::value << std::endl;
std::cout << has_literal_x<two, char const*>::value << std::endl;
std::cout << has_literal_x<int, char const*>::value << std::endl;
}
आउटपुट:
1
1
0
0
0
लेकिन अगर संभवतः अतिभारित उपयोगकर्ता शाब्दिक कम से कम एक परिभाषा नहीं है , यह समाधान काम नहीं करेगा। क्या गैर-मौजूदा अक्षरों के लिए भी इसे जांचने का कोई तरीका है (संभवतः उसी तरह हम जांच सकते हैं कि कक्षा X
में सदस्य member
है, लेकिन मुझे नहीं पता कि यह इस मामले में व्यवहार्य है या नहीं)?
नोट यह परीक्षण कर सकते हैं इस समाधान नहीं करता है काफी काम करता है, तो ऑपरेटर प्रकार के बाद परिभाषित किया गया है विशेषता कम से कम जीसीसी में परिभाषित की गई है: http://coliru.stacked-crooked.com/a/6f70eb6cbf236473 – xinaiz