2016-11-04 82 views
1

我想知道,如果它是可以做到多種類型的一個變量:可能性定義與基於宏觀

class MyClass 
    { 
    public: 
    MyClass(); 
    ... 

#if defined USE_TYPE_ONE 
    static TypeOne myVariable; 
#else 
    static TypeTwo myVariable; 
#endif USE_TYPE_ONE 
    }; 

的原因是,我有兩個班,TypeOne & TypeTwo,與相同的函數變量,但不同的實現和 我不想在調用myVariable的每個地方使用宏。

編輯

感謝迅速的意見和答覆。我不得不提及MyClass在不同的類中使用了很多。這就是爲什麼我想避免模板。因爲即使使用具有默認模板參數類型的模板類,我也必須使用<>(更改許多其他地方)來使用MyClass而不需要TypeOne。

+0

是的,這是可能的。在詢問是否有可能之前,您應該嘗試編譯您的代碼。 – mascoj

+3

聽起來像你需要一個[類模板](http://en.cppreference.com/w/cpp/language/class_template)。 –

+0

@ChrisDrew這可能是正確的做法,除非他需要將MyClass存儲在容器中。 – mascoj

回答

3

您可以使用模板建議,但如果你只需要根據條件兩種類型之間進行切換,並可以訪問C++ 11 <type_traits>(否則考慮更新你的編譯器),那麼你可以使用std::conditional

#include <type_traits> 

constexpr bool USE_TYPE_ONE = true; 

struct TypeOne { }; 
struct TypeTwo { }; 

class MyClass { 
    using Type = std::conditional<USE_TYPE_ONE, TypeOne, TypeTwo>::type; 
    static Type myVariable; 
}; 
2

正如評論指出的那樣,你不必使用宏的,你可以使用一個模板類來實現這一目標:

template <typename T> 
class MyClass 
    { 
    public: 
    MyClass(); 

    static T myVariable; 
    }; 

然後實例它,你怎麼樣(例如用於int類型) :

MyClass<int>::myVariable; 
1

爲什麼不可能呢?這完全有可能。當然,您需要以某種方式在構建中傳遞該預處理變量,並且將其定義爲程序中所有代碼的該類型......但它確實完全可能。