একটি অনুষ্ঠানে একটি ধারণা পাস


12

যেহেতু ধারণাগুলি সংকলন-কাল পূর্বাভাস হিসাবে সংজ্ঞায়িত করা হয়েছে, তাই কি ভবিষ্যদ্বাণীগুলি সংকলন-কালীন অ্যালগরিদমের জন্য পুনরায় ব্যবহার করা সম্ভব? উদাহরণস্বরূপ, টুপলে সমস্ত প্রকারের ধারণার সাথে মিল রয়েছে কিনা তা খতিয়ে দেখা সম্ভব? আমি যতদূর দেখেছি কোনওভাবেই কোনও ফাংশনে কোনও ধারণা দেওয়া সম্ভব নয়, কোন ধরণের ক্ষেত্রে এই ক্ষেত্রে টেমপ্লেটগুলি ব্যবহার করে আমাকে ফিরে আসে।

#include <type_traits>

template<typename T>
concept FloatLike = std::is_same_v<T, float>;

struct IsFloat
{
    template<typename U>
    constexpr static bool test()
    {
       return FloatLike<U>;
    }
};


template<typename Predicate, typename... T>
constexpr bool all_types()
{
    return (Predicate::template test<T>() && ...);
}


int main()
{
   static_assert(all_types<IsFloat, float, float>());
   static_assert(!all_types<IsFloat, float, int>());
}

আমি যা করতে চাই তা হ'ল এরকম কিছু, সুতরাং ধারণাটি ব্যবহার করতে সক্ষম হওয়ার জন্য আমাকে সর্বদা আবদ্ধ করতে হবে না:

template<concept Predicate, typename... T>
constexpr bool all_types()
{
    return (Predicate<T> && ...);
}


int main()
{
   static_assert(all_types<FloatLike, float, float>());
   static_assert(!all_types<FloatLike, float, int>());
}

এর কাছাকাছি যাওয়ার কোনও উপায় আছে কি?


এবং তারপরে ধারণাগুলির ধারণাগুলি যুক্ত করার প্রস্তাব থাকবে ... all_types()... &&return (... && Predicate::template test<Ts>());
বিটিডাব্লু

@ এভিগ এটি দুর্দান্ত হবে :)
ইগোর আর

উত্তর:


5

এর কাছাকাছি যাওয়ার কোনও উপায় আছে কি?

ঠিক আছে, না, সত্যই নয়। সি ++ 20 এ নেই। টেমপ্লেট ধারণা-প্যারামিটারের ভাষাটি আজ নেই। এমনকি ভেরিয়েবল টেম্পলেটগুলি টেমপ্লেট পরামিতি হিসাবে ব্যবহার করা যায় না। সুতরাং যদি কোনও ধারণাটি শুরু হয় তবে আমরা মোড়ানো এড়াতে পারি না।

তবে আমরা যা করতে পারি তা হল সহজ মোড়ক লিখুন। যদি আমরা "পুরাতন স্টাইল" টাইপ বৈশিষ্ট্যগুলি পূর্বাভাস হিসাবে ব্যবহার করতে সম্মত হই, বিশেষত সেগুলি যা std::integral_constantএর মতো আচরণ করে তবে আমরা আমাদের নিজেদেরকে সুন্দর ধারণা "ধারণা" সংজ্ঞা দিতে পারি যা পূর্বাভাস হিসাবে ব্যবহার করা যেতে পারে।

template<typename T>
using FloatLike = std::is_same<T, float>;

template<template <typename> class Predicate, typename... T>
constexpr bool all_types()
{
    return (Predicate<T>{} && ...);
}

এটি যতটা পেতে পারে তত ভাল , যতদূর আমি দেখতে পাচ্ছি।


এটি কোনও জেনেরিক ল্যাম্বডাকে কোনও উপায়ে টেমপ্লেট টেমপ্লেট হিসাবে ঘোষনা দিয়ে কাজ করবে? দেখে মনে হচ্ছে ল্যাম্বদা কখনই টেমপ্লেট হয় না ঠিক, কেবল কল অপারেটরই?
Andreas Loanjoe

নিবন্ধন করুন একটি ল্যাম্বদা কখনই কোনও টেম্পলেট হয় না। তবে আপনি যদি ল্যাম্বডাস চারপাশে পাস করতে ইচ্ছুক হন, তবে সি ++ 20 আপনাকে এটি করার অনুমতি দেয়। আমি কয়েক মিনিটের মধ্যে এর একটি বৈকল্পিক যুক্ত করতে পারি।
স্টোরি টেলার - আনস্ল্যান্ডার মনিকা

@ আন্দ্রেস লোনজোয়ে - দ্বিতীয় ভাবার পরে, একটি ল্যাম্বদা এখনও খুব ভার্বোস বেরিয়ে আসে। আমি মনে করি না এটি একটি দুর্দান্ত বিকল্প। এখানে এটি যাইহোক Godbolt.org/z/QSHy8X
স্টোরি টেলার - আনস্ল্যান্ডার মনিকা

আমি আশা করি তারা আরও ভাল কিছু যুক্ত করবে :), তবে হ্যাঁ মনে হচ্ছে এটি উত্তর, কেবল স্টাইলের ধরণের বৈশিষ্ট্যগুলি এই কার্যকারিতা ধারণাগুলি দেয় না (এখনও)।
Andreas Loanjoe

0

যদি আপনার লক্ষ্যটি হয় "টিপলে সমস্ত ধরণের ধারণার সাথে মানানসই কিনা" তা পরীক্ষা করা , তবে আপনি এই জাতীয় কিছু করতে পারেন:

// concept to check if all types in Ts are the same as T
template<typename T, typename... Ts>
concept AllSame = (std::is_same_v<T,Ts> && ...);

// function only accepts floats as template parameters
template<AllSame<float>... Floats>
constexpr void float_foo()
{
}

// function only accepts ints as template parameters
template<AllSame<int>... Ints>
constexpr void int_foo()
{
}

// function only accepts T as template parameters
template<typename T, AllSame<T>... Ts>
constexpr void foo()
{
}

int main()
{
    int_foo<int, int, int>();
    // int_foo<int, int, double>(); // fails to compile
    float_foo<float, float, float>();
    // float_foo<float, float, int>(); // fails to compile
    foo<int, int, int, int>();
    // foo<int, int, int, float>(); // fails to compile
    foo<double, double, double, double>();
    // foo<double, double, double, int>(); // fails to compile

}

সরাসরি নমুনা


আপনার AllSameবৈচিত্র্য কেন ? কোনও টাইপ-সীমাবদ্ধতার দ্বারা প্রবর্তিত প্যাকের প্রতিটি টেম্পলেট প্যারামিটার আলাদাভাবে ইতিমধ্যে সীমাবদ্ধ।
ডেভিস হ্যারিং

@ ডেভিস হেরিং আমি বুঝতে পারি না। আপনি কি ধারণাটি নিজেই বা টেমপ্লেটের পরামিতিগুলিতে বোঝাচ্ছেন *_foo()?
কানস্তর

আমি আপনাকে বোঝাতে চাইছি কোডটি যদি আপনি এটি ...চালু করেন Tsএবং এটি && ...ব্যবহার করে তবে তা কার্যকর করে। (স্পষ্টতই নামটি AllSameঅনুপযুক্ত হবে, তবে আমি কেন নিশ্চিত নই যে কেন আমি <int,int,int>যেভাবেই ইউরিয়ার মধ্যে একটি গণনা প্রকাশ করতে চাই ))
ডেভিস হেরিং ২

@ ডেভিস হেরিং তারপরে ধারণাটি AllSameকিন্তু হবে না SameAs(দেখুন en.cppreferences.com/w/cpp/concepts/same_as ) এবং ওপি একটি ধারণা নিতে চেয়েছিল যা টেমপ্লেটের প্যারামিটারগুলির একটি বিচিত্র সংখ্যক লাগে।
কানস্টার

অবশ্যই এটা হবে std::same_as। আমি মনে করি না যে বৈচিত্রের অংশটি বিন্দু ছিল: এটি ছিল ধারণার (পছন্দসই) পরিবর্তনশীল পরিচয় । এবং আমার বক্তব্যটি হ'ল আপনার ধারণার উদাহরণের বৈচিত্রপূর্ণ দিকটি এর ব্যবহারের সাথে অপ্রাসঙ্গিক (কারণ অ-বৈকল্পিক ধারণাটি ইতিমধ্যে টেমপ্লেট প্যারামিটার প্যাকগুলির সাথে কাজ করে)।
ডেভিস হ্যারিং
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.