Aşağıdaki şablonu nesne var:Şablon türlerine bağlı olarak kurucuları etkinleştirmek veya devre dışı bırakmak için std :: enable_if öğesini nasıl kullanırım?
template< typename type_1, typename type_2 > struct result
{
// I want to enable these two constructors only if type_1 != type_2
result(type_1 f) : foo{f} {}
result(type_2 b) : bar{b} {}
// I want to enable this constructor only if type_1 == type_2
result(type_1 f, type_2 b) : foo{f}, bar{b} {}
// Other member functions removed.
type_1 foo;
type_2 bar;
};
nasıl gerektiği gibi etkinleştirmek veya devre dışı bırakmak için kurucular std::enable_if
kullanırım?
örn:
Bu seferki olurdu sadece ilk iki kurucular:
result<string,int> // type_1 != type_2
Bu seferki sadece üçüncü yapıcı olurdu:
result<int,int> // type_1 == type_2
Sorunu "result" nesnesinin gösterilmeyen üye işlevleri grubuna sahip olduğundan bahsetmiştim, bu nedenle uzmanlaşma çok fazla kod çoğaltmasına yol açacaktır. –
@DrTwox Sonra Bryan'ın çözümünü kullanın. Maalesef şu anda herhangi bir alternatifin farkında değilim. – 0x499602D2
@DrTwox Tüm ortak kodları bir sınıfa ve diğer koddaki özel koda koyarak bu tekrarı önlemek için kalıtım kullanabilirsiniz. Bu yaygın bir çözümdür. Durumunuza bağlı olarak, CRTP de dahil olmak üzere birkaç şekilde yapabilirsiniz. Örneğin, bir temel sınıftaki kuruculara (ve veri üyelerine) sahip olabilirsiniz, bunlar her iki durumda da (aynı veya değil) uzmanlaşabilir ve türetilmiş sınıfınızda kalıtsal kurucular (C++ 11) kullanabilirsiniz. Ya da tam tersi, temel sınıftaki tüm ortak kodlarla ince bir türetilmiş sınıfı uzmanlaşın. –