PDA

View Full Version : تعریف کردن literals



iut.ali
یک شنبه 02 شهریور 1393, 00:52 صبح
این عنوان پیدا کردن واسه تاپیکم دردسری شده ها مسئولین رسیدگی کنن :خجالت:
میخواستم ببینم literal چیه چطوری تعریف میشه به چه دردی میخوره و یه مثالم اگه برام بزنید که عالی میشه ممنون :متفکر:

rahnema1
یک شنبه 02 شهریور 1393, 09:36 صبح
سلام
literal در واقع همان ثابتهای عددی و رشته ای و .. هستند که چند دسته هستند

literal های صحیح مثل 2 یا 5 یا 6LL یا 0x45
در مورد 45 پیشوند 0x آورده شد که نشان بده در مبنی 16 هست
یا مثلا 6 با پسوند LL آورده شده که مشخص می کنه از نوع long long هست

literal های کاراکتری مثل 'a' یا 'u'b یا ...
که مورد اول از نوع char و پیشوند u در دومی مشخص می کنه ازنوع char16_t هست

literal های اعشاری مثل 12.3 یا 15.6f
که اولی double و دومی float هست

literal های رشته ای مثل "abc" یا "u"def
که مثلا اولی آرایه ثابت از char و دومی آرایه ثابت از char16_t هستند

literal های بولی مثل true یا false

literal اشاره گر که عبارت است از کلمه کلیدی nullptr

و نهایتا literal های تعریف شده توسط کاربر که فکر کنم سوال اصلی هم در این مورد باشه
ما می تونید پسوند هایی به دلخواه تعریف کنیم که وقتی اون را بعد از یک literal گذاشتیم برای ما مثل یک تابع یا عملگر رفتار کنه

روش تعریف هم به این صورته که مثل تعریف سایر عملگرها انجام میشه اما با این تفاوت :
operator "" identifier
که identifier همون پسوند مورد نظره که حرف اول اون با _ شروع می شه
چند تا مثال از این منبع :
http://en.cppreference.com/w/cpp/language/user_literal
مثلا ما می خواهیم یک پسوند تعریف کنیم که بعد از عر عددگذاشتیم درجه را به رادیان تبدیل کنه ( این کار را با تابع هم می تونستیم انجام بدیم)

long double operator"" _deg ( long double deg )
{
return deg*3.141592/180;
}
int main(){
double x = 90.0_deg;
}

یا مثلا می خواهیم یک پسوند تعریف کنیم که چاپ کنه

#include <iostream>
void operator"" _print ( const char* str )
{
std::cout << str;
}

int main(){
54321_print;
}


با استفاده از template هم میشه literal تعریف کنیم
یه سری ریزه کاری ها هم در استفاده ازش هست که توی همون منبع یا استاندارد نوشته شده

iut.ali
یک شنبه 02 شهریور 1393, 13:58 عصر
مثلا ما می خواهیم یک پسوند تعریف کنیم که بعد از عر عددگذاشتیم درجه را به رادیان تبدیل کنه ( این کار را با تابع هم می تونستیم انجام بدیم)

long double operator"" _deg ( long double deg )
{
return deg*3.141592/180;
}
int main(){
double x = 90.0_deg;
}


من این کدو تو ویژوال استادیو کپی کردم یه همچین خطایی میده
IntelliSense: expected an operator
در ضمن مگه کد زیر درست نیست پس چرا ویژوال استادیو بش گیر میده
using myint = int;

rahnema1
یک شنبه 02 شهریور 1393, 17:44 عصر
من این کدو تو ویژوال استادیو کپی کردم یه همچین خطایی میده
IntelliSense: expected an operator
در ضمن مگه کد زیر درست نیست پس چرا ویژوال استادیو بش گیر میده
using myint = int;

gcc پیشتازترین کامپایلر در زمینه پیاده سازی استاندارد هست . در داکیومنت مایکروسافت ببینید اینها پیاده سازی شده یا نه

omid_kma
یک شنبه 02 شهریور 1393, 18:37 عصر
من این کدو تو ویژوال استادیو کپی کردم یه همچین خطایی میده
IntelliSense: expected an operator
در ضمن مگه کد زیر درست نیست پس چرا ویژوال استادیو بش گیر میده
using myint = int;
چه ورژنی ؟ این کد داخل vs2013 مشکلی نداره

iut.ali
یک شنبه 02 شهریور 1393, 22:28 عصر
چه ورژنی ؟ این کد داخل vs2013 مشکلی نداره
version 2012

iut.ali
یک شنبه 16 شهریور 1393, 22:21 عصر
سلام چند وقت پیش این تاپیکو درست کردم و به جواب سوالم رسیدم ولی من نمیتونم از این syntax استفاده کنم حتی از g++ هم استفاده کردم ولی فایده نداشت من از ویژوال استادیو 2013 استفاده می کنم توی g++ هم برای استانداردش از std=c++1y استفاده میکنم ولی بازم خطا میده ممنون میشم بهم راه حل بدید

Azar.099
یک شنبه 16 شهریور 1393, 22:47 عصر
برای من هم خطا میده ...

dasssnj
دوشنبه 17 شهریور 1393, 06:07 صبح
من از vs 2013 استفاده می کنم ولی نمی تونم از قابلیت های سی ++ 11 استفاده کنم . چطور میشه فعالش کرد؟

rahnema1
دوشنبه 17 شهریور 1393, 12:16 عصر
این سایت کد شما را با انواع کامپایلرها تست می کنه:
http://gcc.godbolt.org