Belirli bir şablon türünün argümanlarını alan bir işlev var;Bir const olmayan şablon argüman türünün bir const'e dolaylı olarak dönüştürülmesine izin vermenin kanonik bir yolu var mı?
#include <type_traits>
template <typename T>
struct foo
{
// default constructor
foo() { }
// simple copy constructor that can construct a foo<T> from a foo<T>
// or foo<const T>
foo(const foo<typename std::remove_const<T>::type> &) { }
};
İşlevsel olarak, foo
bu soruya alakalı olmayan başka eklenti işlevselliği ile, bir shared_ptr<T>
benzer şekilde davranır: gibi basitleştirilmiş versiyonu görünebilir. Fonksiyonun semantiği, bir foo<const T>
içinde almayı tercih ettiğini dikte eder. foo<const T>
foo<T>
gelen dolaylı constructible, bu yüzden aşağıdaki gibi bir şey yapabilmek istiyorum:
template <typename T>
void bar(foo<const T> f) { }
int main()
{
bar(foo<const int>()); // fine
bar(foo<int>()); // compile error
}
almak bar
için eşleşen aşırı yükler olduğundan bu başarısız bir foo<int>
(a foo<const int>
dolaylı olabilir rağmen bir foo<int>
inşa, şablon örnekleme uyum içinde aşırı yük çözünürlüğü daha sıkı görünüyor.
bunu yapmanın kurallı bir yolu var mı? Benalır bar()
için ikinci aşırı katılabileceği de biliyoruz 0 ve bar(foo<const T>)
'a elle gönderir, ancak mümkünse çoğaltmayı önlemek isterim.
İşleri ince (bcc32) ancak C++ 14 ('types' const T 've' int 'ile uyumlu olmayan cv-qualifiers') kullanarak ideone.com'da değil. –
Sadece ben mi yoksa tersini mi yaptın? Copy c-tor 'remove_const' kullanır ve açıklamanız ve' bar 'sözcüğünü kullanan kod ** **' const 'ekleyen bir durum hakkındadır. –
@YehezkelB .: Buradaki fikir, 'foo 'foo'nun ' yapısından yapılabilmesidir, bu yüzden kurucunun argümanında 'const' öğesini kaldırmanız gerekir. Ben * düşünüyorum * yazılı olarak doğru. –