class GenericNode {
public:
GenericNode(GenericNode*... inputs) {
/* Something like... */
// inputs_.push_back(inputs)...;
}
private:
std::vector<GenericNode*> inputs_;
};
cevap
iyi şey olurdu başlatıcı listesi C++ 11 kullanılarak
#include <initializer_list>
#include <vector>
class GenericNode {
public:
GenericNode(std::initializer_list<GenericNode*> inputs)
:inputs_(inputs) {} //well that's easy
private:
std::vector<GenericNode*> inputs_;
};
int main() {
GenericNode* ptr;
GenericNode node{ptr, ptr, ptr, ptr};
} //compilation at http://stacked-crooked.com/view?id=88ebac6a4490915fc4bc608765ba2b6c
zaten ne kadar yakın, vektörün initializer_list kullanmaktır:
template<class ...Ts>
GenericNode(Ts... inputs)
:inputs_{inputs...} {} //well that's easy too
//compilation at http://stacked-crooked.com/view?id=2f7514b33401c51d33677bbff358f8ae
Ve burada hiç bir initializer_lists olmayan bir C++ 11 sürümü var. Çirkin ve karmaşıktır ve birçok derleyiciden eksik özellikler gerektirir. O sahip işaretçileri veya değilse her şeye
template<class T>
using Alias = T;
class GenericNode {
public:
template<class ...Ts>
GenericNode(Ts... inputs) { //SFINAE might be appropriate
using ptr = GenericNode*;
Alias<char[]>{(//first part of magic unpacker
inputs_.push_back(ptr(inputs))
,'0')...,'0'}; //second part of magic unpacker
}
private:
std::vector<GenericNode*> inputs_;
};
int main() {
GenericNode* ptr;
GenericNode node(ptr, ptr, ptr, ptr);
} //compilation at http://stacked-crooked.com/view?id=57c533692166fb222adf5f837891e1f9
//thanks to R. Martinho Fernandes for helping me get it to compile
İlgisiz başlatıcı listesini kullanın, ben bilmiyorum. Öyleyse, bunun yerine std::unique_ptr
kullanın.
Şablon
@JonathanWakely: Neden hiç düşünmediğim hakkında bir fikrim yok. Sabit. –
@MooingDuck, others: Teşekkürler. Tam ihtiyacım olan şey. – fredbaba
: Bir kullanmak
class GenericNode {
public:
GenericNode(std::initializer_list<GenericNode*> inputs) : inputs_(inputs)
{
}
private:
std::vector<GenericNode*> inputs_;
};
template <class ... T>
GenericNode* foo(T ... t)
{
return new GenericNode({t...});
}
Neden yardım işleviniz var? –
@MooingDuck Sadece variadic şablon parametrelerinin kullanımını göstermek için –
// inputs_.push_back(inputs)...;
sadece böyle bir fonksiyon argüman listesi veya başlatıcı-liste olarak belli bağlamlarda, bir ifadesi olarak bir parametre paketi genişletmek olamaz, çünkü bu işe yaramaz.
Ayrıca yapıcınızın imzası da yanlıştır, eğer değişken bir şablon yazmaya çalışıyorsanız, şablon olması gerekir!
Eğer yapıcı imza düzgün cevap kolaydır yazdıktan sonra sadece paket genişleme ile vektör yapılandırmak:
#include <vector>
class GenericNode
{
public:
template<typename... T>
GenericNode(T*... inputs) : inputs_{ inputs... }
{ }
private:
std::vector<GenericNode*> inputs_;
};
(yerine ile yapıcı gövdesinde ayarlamak olabilirdi:
inputs_ = { inputs... };
ama havalı üye başlatıcıları yapıcı gövdesinde değil atama kullanır.)
bu çözümün dezavantajı olduğunu şablon yapı veya herhangi bir gösterici argümanı türünü kabul eder, ancak argümanlar GenericNode*
'a dönüştürülemiyorsa, vektör oluşturmaya çalışırken bir hata verecektir. Yalnızca GenericNode
işaretçiler kabul etmek şablonu sınırlamak olabilir, ancak diğer cevaplar önermek ne ve yapıcı bir std::initializer_list<GenericNode*>
almak yaparsanız otomatik olarak böyle oluyor ve sonra herhangi bir çirkin enable_if
SFINAE hileler gerekmez.
bir başka yolu bunu yapmak için:
#include <iostream>
#include <vector>
using std::vector;
template <typename T>
void variadic_vector_emplace(vector<T>&) {}
template <typename T, typename First, typename... Args>
void variadic_vector_emplace(vector<T>& v, First&& first, Args&&... args)
{
v.emplace_back(std::forward<First>(first));
variadic_vector_emplace(v, std::forward<Args>(args)...);
}
struct my_struct
{
template <typename... Args>
my_struct(Args&&... args)
{
variadic_vector_emplace(_data, std::forward<Args>(args)...);
}
vector<int>& data() { return _data; }
private:
vector<int> _data;
};
int main()
{
my_struct my(5, 6, 7, 8);
for(int i : my.data())
std::cout << i << std::endl;
}
class Blob
{
std::vector<std::string> _v;
public:
template<typename... Args>
Blob(Args&&... args)
: _v(std::forward<Args>(args)...)
{ }
};
int main(void)
{
const char * shapes[3] = { "Circle", "Triangle", "Square" };
Blob b1(5, "C++ Truths");
Blob b2(shapes, shapes+3);
}
Örnek C++ 11 Gerçeğin yeterince ... basit görünüyor;) değil komple bir çözüm ama size bazı fikirler verebilir.
Bu, 'b1' ve 'b2' örnekleriniz için işe yarıyor, ancak OP yapmak istiyor 'Blob b3 {" Daire "," Üçgen "," Kare "};' ve sizin 'Blob' yapıcınız bunu yapamaz Çünkü, _v' için değer sıfırlama kullanıyorsunuz. Eğer '_v' için liste başlatmayı kullanmak için değiştirirseniz, OP'nin ne yapmak istediğini destekleyecektir. –
- 1. Varsayılan argüman ile değişken uzunluk argüman listesi?
- 2. bir liste/değişken bir öğeyi kaldırmak - Ben dosyaların bir listesi olarak bir değişken ararsanız Bash
- 3. subprocess.Popen: Bir listeyi argüman olarak nasıl geçebilir
- 4. ben bu tabloda bir listesi var
- 5. Bir argüman listesi, bilinen parametre türleriyle değişken uzunluklu olarak nasıl belgelenir?
- 6. Named Parametreler ve ben bir değişken uzunluk argüman listesi ile C# yöntemine sahip C#
- 7. Belirli bir metinde "şablonlar" keşfetmek mi istiyorsunuz?
- 8. Argüman listesi - Unix
- 9. Window.getComputedStyle Ben HTML öğesine bazı verileri eklemek istiyorsunuz Firefox
- 10. Ben bir argüman için varsayılan değer olarak kullanmak istiyorum bir değişken var
- 11. 'GameSetting.init' bir argüman listesi ile çağrlanılamıyor
- 12. Bir DBML diyagramını yenilemek mi istiyorsunuz?
- 13. Julia: Boş bir vektöre ekle
- 14. Python fonksiyon argüman listesi
- 15. Son elemanına bağlı olarak bir vektöre bir şey iterek
- 16. gerçek argüman olarak bir işleve bir jenerik prosedürü geçme ben bir işleve gerçek argüman olarak bir jenerik prosedür geçmesi çalışılıyor
- 17. C/C++ macro argüman olarak genişletiliyor, argüman olarak argüman
- 18. Resmi aşağıdan döndürmek mi istiyorsunuz?
- 19. Octave'de bir vektöre nasıl ekleyebilirim?
- 20. Burada bash işlevine bir argüman olarak döküman
- 21. Boş hedefleri listesi (MAVEN) i bir hedef eklemek çalıştığınızda
- 22. Bir Argüman Olarak DataType Gönderiliyor?
- 23. Bir data.table satırının bir vektöre dönüştürülmesi
- 24. Bir işlev, D'de zaten verilen parametrelerle bağımsız değişken olarak nasıl çağrılır?
- 25. İlk olarak bir değişken bildirilmeden başvurular yapılabilir mi?
- 26. Bir öğenin yüksekliğini görünüm penceresindeki mevcut yüksekliğe mi ayarlamak istiyorsunuz?
- 27. Sass ben bu değişkeni var başka değişken
- 28. jQuery Ben bu mümkün olmadığı konusunda somut bir cevap bulamadım form
- 29. sütunu bir değişken adı ile tanımlanır nerede, ben bir sütun eklemek istediğiniz, sütun adı bir dataframe var değişken
- 30. Neden kimse is.wholenumber bu toleransı kullanmak istiyorsunuz
Örneğinizde geçersiz bir sözdizimi var. Özellikle ne sormaya çalışıyorsun? –
'std :: initializer_list' işlevini kullanın. –
Üzgünüm. Açıklığa kavuşturmak için, bir std :: vektörünü doldurmak için argüman listesini nasıl kullanırım? @MooingDuck, std :: initializer_list dosyasına bakacağım. Teşekkürler. – fredbaba