बोल्ड:
#include <string>
template <class T, T x, class F>
void transparent(F f) { f(); }
template <bool B>
constexpr void my_assert() {
static_assert(B, "oh no");
}
template <int X>
void f() {
transparent<int, X+7>([]{
transparent<long, X*X*X>([]{
my_assert<X+10==-89>(); });});
}
int main() {
// f<3>();
f<4>();
// f<-99>();
}
यहाँ त्रुटि है कि यह मुझे मिल गया है
मेरा वीसी ++ कोड जो प्रिंट करता है, संकलन के दौरान, जितना आप चाहते हैं उतने संकलन समय स्थिरांक का मूल्य (जैसे आकार संरचनाएं) और त्रुटि के बिना संकलन जारी रखें:
// cpptest.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
//#define VALUE_TO_STRING2(x) #x
//#define VALUE_TO_STRING(x) VALUE_TO_STRING2(x)
#define TO_STRING(x) #x
#define FUNC_TEMPLATE_MSG(x,y) "[" x "]""["TO_STRING(y)"]"
template<unsigned int N,unsigned int M>
int printN()
{
#pragma message(FUNC_TEMPLATE_MSG(__FUNCSIG__ ,1))
return 0;
};
struct X {
char a[20];
int b;
};
struct Y {
char a[210];
int b;
};
int _tmain(int argc, _TCHAR* argv[])
{
printN<sizeof(X),__COUNTER__>();
printN<sizeof(Y),__COUNTER__>();
//..as many compile time constants as you like
}
वीसी ++ 2010 द्वारा उत्पादित नमूना आउटपुट। लक्ष्य मान पहला फ़ंक्शन टेम्पलेट पैरामीटर मान (उदाहरण में 0x18 और 0xd8) है जिसे वीसी ++ ने विषम रूप से आउटपुट को हेक्साडेसिमल मान के रूप में चुना है !!
1>------ Build started: Project: cpptest, Configuration: Release Win32 ------
1> cpptest.cpp
1> [int __cdecl printN<0x18,0x0>(void)][1]
1> [int __cdecl printN<0xd8,0x1>(void)][1]
1> Generating code
1> Finished generating code
1> cpptest.vcxproj -> c:\work\cpptest\Release\cpptest.exe
========== Build: 1 succeeded, 0 failed, 0 up-to-date, 0 skipped ==========
प्रमुख यहां इस्तेमाल तकनीक है कि एक प्रत्येक कार्य टेम्पलेट इन्स्टेन्शियशन दौरान, #pragma message()
निर्देश एक बार शुरू हो जाती है है। माइक्रोसॉफ्ट विशिष्ट मैक्रो __FUNCSIG__
युक्त फ़ंक्शन के हस्ताक्षर को प्रदर्शित कर सकता है और इस प्रकार पूर्णांक मान फ़ंक्शन टेम्पलेट के प्रत्येक विशिष्ट तत्कालता में उपयोग किया जा सकता है। दूसरे टेम्पलेट पैरामीटर के रूप में COUNTER
देना यह सुनिश्चित करना है कि एक ही मान के 2 पूर्णांक अभी भी अलग-अलग मानते हैं। #pragma
निर्देश में 1 का कोई उपयोग नहीं है, लेकिन अगर हमारे पास 1 से अधिक ऐसे निर्देश हैं और आउटपुट विंडो गन्दा संदेशों से भरा है तो पहचानकर्ता के रूप में उपयोग किया जा सकता है।
शर्म 'static_assert' का संदेश तर्क यह नहीं कर सकता है। –
आप हालत विफलता पर अपूर्ण प्रकार को मजबूर कर नियमित संकलक डायग्नोस्टिक्स का उपयोग कर सकते हैं, जो संकलक आउटपुट में दिखाई देने वाले टेम्पलेट तर्कों का कारण बन सकता है, [जैसे यहां] (http://coliru.stacked-crooked.com/a/ d2a8871788e97987) –
मैं इसे वीसी ++ के साथ कर सकता हूं (मेरा जवाब देखें)। शायद कोई यह देखने का प्रयास कर सकता है कि जीसीसी – JavaMan