كيفية كتابة قالب الأمراض المنقولة جنسيا :: bitset التي تعمل على 32 و 64 بت

StackOverflow https://stackoverflow.com/questions/645168

  •  22-07-2019
  •  | 
  •  

سؤال

والنظر في التعليمة البرمجية التالية

template<unsigned int N> void foo(std::bitset<N> bs)
{ /* whatever */ }

int main()
{
    bitset<8> bar;
    foo(bar);
    return 0;
}

وز ++ يشكو هذا على 64 بت لأن <8> يحصل تفسر على أنها عدد صحيح طويل غير موقعة، والتي لا تتطابق تماما مع القالب. إذا قمت بتغيير القالب يقول الباحث طويل غير موقعة، ثم يجمع 32 بت شكوى.

ومن الواضح أن طريقة واحدة لإصلاح هذا هو تغيير bitset <8> لbitset <8ul>، ولكن ليس هناك أي وسيلة لإعادة كتابة <م> قالب جزء بحيث ستعمل مع أي الافتراضي تفسير حرفي رقمي هو؟

هل كانت مفيدة؟

المحلول

والمشكلة ليست ما إذا كان أو لا تكتب 8u أو 8. المشكلة لا علاقة لها نوع معلمة قالب قالب الدالة. نوعه أن تتطابق مع تلك المستخدمة في إعلان std::bitset. وهذا ما size_t وفقا لمعيار (قسم 23.3.5)

namespace std {
    template<size_t N> class bitset {
    public:
    // bit reference:
        ...

والاستثناء هم أبعاد مجموعة، والتي يمكنك استخدام أي نوع عدد صحيح (حتى bool - ثم حجم الوحيد الذي يمكن قبوله هو 1 طبعا):

// better size_t (non-negative), but other types work too
template<int N> void f(char(&)[N]);

ولكن في مناسبات أخرى، وأنواع يجب أن تطابق. لاحظ أن هذا ينطبق فقط على الحجج قالب autodeduced، ولكن ليس لإعطاء صراحة منها. والسبب هو أن لتلك استنتاجها، المترجم يحاول معرفة أفضل مباراة بين الحجج قالب الفعلية وما يستنتج من الدعوة إليها. غير مسموح العديد من تحويلات ضمنية على خلاف ذلك الحين. لديك مجموعة كاملة من التحويلات المتاحة إذا وضعت على حجة واضحة (تجاهل الحل استخدام size_t الآن لجعل وجهة نظري)

template<int N> void foo(std::bitset<N> bs)
{ /* whatever */ }

int main() {
    bitset<8> bar;
    foo<8>(bar); // no deduction, but full range of conversions
}

نصائح أخرى

استخدم size_t. sayeth حتى MSDN على الأقل.

وينبغي أن تفسر حرفي رقمي كما عدد صحيح بغض النظر عن منصة

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top