2016-11-23 2 views
1

Hier eine Kontraktion einer Bibliothek arbeite ich an:Variablen-Typen in der Kompilierung C entscheiden ++

class pool 
{ 
private: 
    std::vector<int> m_buffer; 
public: 
    void insert(int a) { m_buffer.push_back(a); } 
    int size() { return (int)(m_buffer.size()); } 
    virtual ~pool() {} 
}; 

class customMem 
{ 
public: 
    static thread_local pool poolmanager; 
    static boost::thread_specific_ptr< pool> poolmanager_boost; 
}; 

thread_local pool customMem::poolmanager; 
boost::thread_specific_ptr<pool> customMem::poolmanager_boost; //very slow 

class MVeryLongData : public customMem 
{ 
public: 
    MVeryLongData(bool localthread, int a) 
    { 
     if (localthread) 
     { 
      customMem::poolmanager.insert(a); 
     } 
     else 
     { 
      if (!customMem::poolmanager_boost.get()) { 
       // first time called by this thread 
       // construct test element to be used in all subsequent calls from this thread 
       customMem::poolmanager_boost.reset(new pool); 
      } 
      customMem::poolmanager_boost->insert(a); 
     } 
    } 
    int size() { return customMem::poolmanager.size(); } 
}; 

void func(bool localthread) 
{ 
    #pragma omp parallel for 
    for (int i = 0; i < 10000000; i++) 
    { 
     MVeryLongData a(localthread, i); 
    } 
} 

Ich frage mich, ob es einen Weg Bool localthread in Funktion func loszuwerden ist irgendwie durch merge poolmanager_boost und poolmanager. Der Grund für den Aufruf dieser beiden Variablen ist, dass die thread_local nicht vollständig in Visual Studio C++ 12 unterstützt wird.

Bitte lassen Sie mich, wenn es möglich ist oder nicht (Zusammenführung). Kann ich std konditional verwenden?

Bitte beachten Sie, dass ich versuche, Vorlagen zu vermeiden.

BEARBEITEN: Da ich keine Lösung zu meiner Frage finden konnte, denke ich, habe ich keine andere Wahl, als Vorlage zu verwenden. So Lösung mit Vorlage ist auch geschätzt. so etwas wie eine Getter-Funktion, die einen Pointer entweder als boost_thread_ptr oder als thread_local-Pool * zurückgibt.

+2

Dann Überlastung verwenden Sie kein Glück. Dafür gibt es Vorlagen. Die einzige andere Lösung ist unordentlich und beinhaltet Makros. – StoryTeller

+0

Ich vermeide Vorlagen, da customMem in vielen anderen Positionen verwendet wurde. Was bedeutet, dass ich sie auch berühren muss, denke ich. Habe ich recht? –

+0

ist 'bool localthread' eine Kompilierzeitkonstante? – StoryTeller

Antwort

0

können Sie

struct localthread{}; 
    struct nonlocaltchread{}; 

    MVeryLongData(int a, localthread) 
    MVeryLongData(int a, nonlocaltchread)