كيفية استخدام معلمة القالب في قالب معلمة أخرى أعلن قبل

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

سؤال

ومعلمة قالب يمكن استخدامها في المعلمة قالب آخر يتبع ذلك بهذه الطريقة:

template<typename T, T N>
struct s
{
};

ولكن هل من الممكن أن مرجع "T" إذا أعلن أنه بعد "N"؟

وهذا لا يعمل:

template<T N, typename T>
struct s
{
};

هل يمكننا مساعدة مترجم من قبل معلنا "T" أو القيام بأي شيء آخر؟

والشكر بواسطة مسبقا.

وتحرير: كما الردود الأولين كانوا يتساءلون "لماذا أنت على استعداد للقيام بذلك؟" ساوضح الهدف:

وأود أن جعل مترجم استنتاج نوع "T" من أجل جعل استخدام الفئات قالب أسهل.

وعلى سبيل المثال:

template<typename T, T A, T B>
struct sum
{
    static T const value = A + B;
};

ويمكن استخدام هذا القالب بهذه الطريقة:

sum<int, 1, 2>::value

ولكن سيكون من الأفضل لو أنها يمكن أن تستخدم هذه الطريقة:

sum<1, 2>::value

وتقنيا انها يجب أن يكون ممكنا لأن المترجم يعرف أنواع من "1" و "2": "كثافة"، في واقع الأمر أنه يستخدم هذه المعلومات لإيجاد أفضل الزائد عن وظيفة. ذلك بإعلان القالب بهذه الطريقة:

template<T A, T B, typename T>
struct sum
{
    static T const value = A + B;
};

والمترجم ويمكن استخدام قدرته على استنتاج المعلمة الأخيرة من المعلومات التي تقدمها لأول مرة وثانية واحدة، ومن ثم العثور على أفضل قالب إنشاء مثيل.

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

المحلول

ومثل الآخرين أقول - لا لم يكن ذلك ممكنا، والمترجم لا يمكن الاستدلال نوع T من غير نوع <م> قالب الحجج (في حالة وظائف، فإنه يستنتج أنواع من وظيفة الحجج):

و14.8.2.4/12:

<اقتباس فقرة>   

وهناك حجة نوع القالب لا يمكن استنتاجها من نوع من عدم نوع القالب حجة.

في أي حال، سيتم إجراء أي خصم للوسائط من قالب فئة على أي حال. مثال للقالب وظيفة قد يكون

template<int> struct having_int { };
template<typename T, T i> void f(having_int<i>);
int main() { having_int<0> h; f(h); }

في هذه الحالة، لن يتم استنتاجها T كما int - لديك لتحديد ذلك صراحة.

نصائح أخرى

وأنت لا تستطيع ذلك. أنا لا أرى هذه النقطة لماذا كنت تفعل ذلك أيضا.

وفيما يلي القمامة وأنا لم أقرأ سؤالك بشكل صحيح.

والواقع، وأنا لا أرى أي نقطة في ما تحاول تحقيقه سواء.

#include <iostream>

template<typename T, T N>
struct s
{
    T size() { return N; }
};


int main()
{
    s<int, 4> x;
    std::cout << x.size()<< '\n';

    //s<float, 3.14> f; //this doesn't compile
}

وهذا يجمع بالنسبة لي مع دول مجلس التعاون الخليجي وكومو أون لاين.

وأعتقد أن المشكلة هي مع نوع T تحاول استخدام. غير نوع الحجج القالب فقط دعم أنواع لا يتجزأ، ومن ثم مؤشرات إلى الكائنات مع الربط الخارجي (أو شيء من هذا القبيل، وربما بضعة أشياء أخرى محدودة جدا).

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