यह तकनीकी रूप से संभव है, यह बहुत ही बदसूरत है। यहां एक नमूना है जो एक हस्ताक्षरित int के लिए एक स्ट्रिंग अक्षर बनाता है। यह (1) 3 "i-1" फ़ॉर्म की एक स्ट्रिंग नहीं बनाता है, हालांकि मुझे यकीन है कि यदि आप प्रयास करने के इच्छुक हैं तो यह संभव है।
#include <iostream>
#include <string>
#include <limits>
///////////////////////////////////////////////////////////////////////////////
// exponentiation calculations
template <int accum, int base, int exp> struct POWER_CORE : POWER_CORE<accum * base, base, exp - 1>{};
template <int accum, int base>
struct POWER_CORE<accum, base, 0>
{
enum : int { val = accum };
};
template <int base, int exp> struct POWER : POWER_CORE<1, base, exp>{};
///////////////////////////////////////////////////////////////////////////////
// # of digit calculations
template <int depth, unsigned int i> struct NUM_DIGITS_CORE : NUM_DIGITS_CORE<depth + 1, i/10>{};
template <int depth>
struct NUM_DIGITS_CORE<depth, 0>
{
enum : int { val = depth};
};
template <int i> struct NUM_DIGITS : NUM_DIGITS_CORE<0, i>{};
template <>
struct NUM_DIGITS<0>
{
enum : int { val = 1 };
};
///////////////////////////////////////////////////////////////////////////////
// Convert digit to character (1 -> '1')
template <int i>
struct DIGIT_TO_CHAR
{
enum : char{ val = i + 48 };
};
///////////////////////////////////////////////////////////////////////////////
// Find the digit at a given offset into a number of the form 0000000017
template <unsigned int i, int place> // place -> [0 .. 10]
struct DIGIT_AT
{
enum : char{ val = (i/POWER<10, place>::val) % 10 };
};
struct NULL_CHAR
{
enum : char{ val = '\0' };
};
///////////////////////////////////////////////////////////////////////////////
// Convert the digit at a given offset into a number of the form '0000000017' to a character
template <unsigned int i, int place> // place -> [0 .. 9]
struct ALT_CHAR : DIGIT_TO_CHAR< DIGIT_AT<i, place>::val >{};
///////////////////////////////////////////////////////////////////////////////
// Convert the digit at a given offset into a number of the form '17' to a character
// Template description, with specialization to generate null characters for out of range offsets
template <unsigned int i, int offset, int numDigits, bool inRange>
struct OFFSET_CHAR_CORE_CHECKED{};
template <unsigned int i, int offset, int numDigits>
struct OFFSET_CHAR_CORE_CHECKED<i, offset, numDigits, false> : NULL_CHAR{};
template <unsigned int i, int offset, int numDigits>
struct OFFSET_CHAR_CORE_CHECKED<i, offset, numDigits, true> : ALT_CHAR<i, (numDigits - offset) - 1 >{};
// Perform the range check and pass it on
template <unsigned int i, int offset, int numDigits>
struct OFFSET_CHAR_CORE : OFFSET_CHAR_CORE_CHECKED<i, offset, numDigits, offset < numDigits>{};
// Calc the number of digits and pass it on
template <unsigned int i, int offset>
struct OFFSET_CHAR : OFFSET_CHAR_CORE<i, offset, NUM_DIGITS<i>::val>{};
///////////////////////////////////////////////////////////////////////////////
// Integer to char* template. Works on unsigned ints.
template <unsigned int i>
struct IntToStr
{
const static char str[];
};
template <unsigned int i>
const char IntToStr<i>::str[] =
{
OFFSET_CHAR<i, 0>::val,
OFFSET_CHAR<i, 1>::val,
OFFSET_CHAR<i, 2>::val,
OFFSET_CHAR<i, 3>::val,
OFFSET_CHAR<i, 4>::val,
OFFSET_CHAR<i, 5>::val,
OFFSET_CHAR<i, 6>::val,
OFFSET_CHAR<i, 7>::val,
OFFSET_CHAR<i, 8>::val,
OFFSET_CHAR<i, 9>::val,
NULL_CHAR::val
};
///////////////////////////////////////////////////////////////////////////////
// Tests
int _tmain(int argc, _TCHAR* argv[])
{
std::wcout << IntToStr<17>::str << std::endl;
std::wcout << IntToStr<173457>::str << std::endl;
std::wcout << IntToStr<INT_MAX>::str << std::endl;
std::wcout << IntToStr<0>::str << std::endl;
std::wcout << IntToStr<1>::str << std::endl;
std::wcout << IntToStr<-1>::str << std::endl;
return 0;
}
यह संभव नहीं है। आप इसे प्राप्त करने की कोशिश कर रहे हैं क्या? –
@Moo: जिज्ञासा, अभी तक कोई उपयोग नहीं है। यदि 'i' प्रीप्रोसेसर स्थिर था, तो यह आसान होगा, लेकिन टेम्पलेट्स के साथ मैं इसे हल करने के तरीके के बारे में सोच नहीं सकता था। – Thomas
@ रेनो: टेम्पलेट, क्योंकि विभिन्न 'i' के लिए कई तात्कालिकताएं हो सकती हैं; मैं बिना किसी संरचना के इसे कैसे लिख सकता हूं? मुझे नहीं लगता कि 'टेम्पलेट < int i > कॉन्स char * s = ...;' संकलित होगा। – Thomas