Bu tür bilgileri sağlayan bir şey olduğunu düşünmüyorum, ancak kendi özelliğinizi yazabilirsiniz. Bununla birlikte, muhtemelen bir seçenek olmayan, kullanılabilecek her dayanıklı konteyner için uzmanlaşmanız gerekir.
#include <boost/container/vector.hpp>
#include <iostream>
#include <type_traits>
#include <list>
#include <vector>
template <template <typename...> class Container>
struct is_stable
: std::false_type
{};
template <>
struct is_stable<std::list>
: std::true_type
{};
template <>
struct is_stable<boost::container::stable_vector>
: std::true_type
{};
template<template <typename...> class Container = std::list>
class Foo
{
static_assert(is_stable<Container>::value, "Container must be stable");
};
int main()
{
Foo<std::list> f1; // ok
Foo<std::vector> f2; // compiler error
}
Ben otomatik olarak bir kap manuel uzmanlaşma başvurmadan, istikrarlı olduğunu algılayabilen bir yolu yoktur sanmıyorum.
concept StableGroup<typename C, typename Op>
: Container<C>
{
void operator()(Op, C, C::value_type);
axiom Stability(C c, Op op, C::size_type index, C::value_type val)
{
if (index <= c.size())
{
auto it = std::advance(c.begin(), index);
op(c, val);
return it;
}
<->
if (index <= c.size())
{
op(c, val);
return std::advance(c.begin(), index);
}
}
}
doğru bu düşünüyorsanız:
Sadece eğlence için, ben (considered for inclusion in C++11 idi dile uzatma concepts ve axioms edilir) istikrar için konsept/aksiyomdur nasıl görüneceğini yazmaya çalıştı Özgün kapsayıcı üzerindeki her yineleyicinin değiştirilmiş kapsayıcıdaki karşılık gelen yineleyiciye eşdeğer olması gereğini yakalar. Bunun çok kullanışlı olduğundan emin değilsiniz, ancak bu tür aksiyomlarla karşılaşmak ilginç bir alıştırmadır :)!
İlginç bir soru. –
Bu yüzden kavramlara ihtiyacımız var! (Sanırım) –
@MarkGarcia: Aslında bu yüzden * aksiyomlara * ihtiyacımız var. Aksiyomsuz kavramlar, bu anlamsal gereklilikleri yakalayamaz. Onlara yakında sahip olacağımızdan emin değilim ... –