মনোযোগ Mozza314
এখানে জেনেরিক std::algorithm
কলিংয়ের প্রভাবগুলির সিমুলেশন রয়েছে std::swap
এবং ব্যবহারকারীকে নাম স্থানের স্ট্যান্ডে তাদের অদলবদল সরবরাহ করে। এটি যেমন একটি পরীক্ষা, তাই এই সিমুলেশনটি namespace exp
পরিবর্তে ব্যবহার করে namespace std
।
// simulate <algorithm>
#include <cstdio>
namespace exp
{
template <class T>
void
swap(T& x, T& y)
{
printf("generic exp::swap\n");
T tmp = x;
x = y;
y = tmp;
}
template <class T>
void algorithm(T* begin, T* end)
{
if (end-begin >= 2)
exp::swap(begin[0], begin[1]);
}
}
// simulate user code which includes <algorithm>
struct A
{
};
namespace exp
{
void swap(A&, A&)
{
printf("exp::swap(A, A)\n");
}
}
// exercise simulation
int main()
{
A a[2];
exp::algorithm(a, a+2);
}
আমার জন্য এটি প্রিন্ট করে:
generic exp::swap
যদি আপনার সংকলক কিছু আলাদা প্রিন্ট করে তবে এটি টেমপ্লেটগুলির জন্য "দ্বি-পর্যায়ের অনুসন্ধান" সঠিকভাবে প্রয়োগ করছে না।
আপনার সংকলক যদি (সি ++ 98/03/11 এর যে কোনও একটি) মেনে চলে, তবে এটি আমার দেখানো একই আউটপুট দেবে। এবং সেক্ষেত্রে আপনি যা হবেন ঠিক তা ঘটবে, ঘটবে। এবং আপনার swap
নেমস্পেসে রেখে std
( exp
) এটি ঘটতে বাধা দেয় না।
ডেভ এবং আমি দুজনই কমিটির সদস্য এবং এক দশক ধরে মানকতার এই ক্ষেত্রটিতে কাজ করে যাচ্ছি (এবং সবসময় একে অপরের সাথে একমত নয়)। তবে এই বিষয়টি দীর্ঘদিন ধরে নিষ্পত্তি হয়েছে, এবং আমরা উভয়ই কীভাবে এটি নিষ্পত্তি হয়েছে সে বিষয়ে একমত। আপনার নিজের বিপদে এই অঞ্চলে ডেভের বিশেষজ্ঞ মতামত / উত্তর উপেক্ষা করুন।
এই সমস্যাটি C ++ 98 প্রকাশের পরে প্রকাশিত হয়েছিল। 2001 সালের শুরুতে ডেভ এবং আমি এই অঞ্চলটিতে কাজ শুরু করি । এবং এটি আধুনিক সমাধান:
// simulate <algorithm>
#include <cstdio>
namespace exp
{
template <class T>
void
swap(T& x, T& y)
{
printf("generic exp::swap\n");
T tmp = x;
x = y;
y = tmp;
}
template <class T>
void algorithm(T* begin, T* end)
{
if (end-begin >= 2)
swap(begin[0], begin[1]);
}
}
// simulate user code which includes <algorithm>
struct A
{
};
void swap(A&, A&)
{
printf("swap(A, A)\n");
}
// exercise simulation
int main()
{
A a[2];
exp::algorithm(a, a+2);
}
আউটপুট হল:
swap(A, A)
হালনাগাদ
একটি পর্যবেক্ষণ করা হয়েছে যে:
namespace exp
{
template <>
void swap(A&, A&)
{
printf("exp::swap(A, A)\n");
}
}
কাজ করে! তাহলে কেন এটি ব্যবহার করবেন না?
আপনার শ্রেণিবদ্ধ যে কেসটি বিবেচনা করুন A
:
// simulate user code which includes <algorithm>
template <class T>
struct A
{
};
namespace exp
{
template <class T>
void swap(A<T>&, A<T>&)
{
printf("exp::swap(A, A)\n");
}
}
// exercise simulation
int main()
{
A<int> a[2];
exp::algorithm(a, a+2);
}
এখন আর কাজ করে না। :-(
সুতরাং আপনি swap
নেমস্পেস স্টাডিতে লাগাতে পারেন এবং এটি কাজ করতে পারেন। কিন্তু আপনি লাগাতে মনে রাখা প্রয়োজন হবে swap
মধ্যে A
ক্ষেত্রে জন্য এর নামস্থান আপনি একটি টেমপ্লেট আছে: A<T>
। যেহেতু উভয় ক্ষেত্রেই যদি আপনি করা কাজ করবে swap
মধ্যে A
এর নামস্থান, এটা (ও শিক্ষা দেয় অন্যদের কাছে) শুধু এটা করতে যে এক উপায় মাত্র মনে রাখা সহজ।