2013-06-26 4 views
1

я иметь глобальную структуруШаблонные глобальная структура в C++

template <class FLOAT> 
struct Cstruct { 
    FLOAT var1; 
    FLOAT var2; 
}; 

FLOAT может быть «двойной» или «INT»

я хочу объявить глобальный объект Cstruct, но я, если он не будет знать, быть «double» или «int» во время компиляции. есть ли способ достичь этого? заранее спасибо.

+3

Как вы планируете использовать это? –

+0

gloabl Cstruct будет содержать некоторые данные (двойные или int kind), которые в конечном итоге будут использоваться другими функциями memeber объекта. много данных. в конечном итоге я буду использовать его для программы cuda, где мне нужно определить данные в глобальной памяти для моей конкретной цели. – user1612986

ответ

0

Вы должны знать тип шаблона во время компиляции.

Если вам нужно выяснить тип во время выполнения, то я бы предложил просто иметь каждый атрибут вместо boost::variant<int, double>.

+0

есть другой выход без использования boost или любых других библиотек. Я хочу простой C++ или c-решение. – user1612986

0

Один вид безумного подхода состоит в том, чтобы сделать всю вашу программу в большом template.

В этом большом template<class Float> struct Program { ... }; вы используете методы для функций static.

Во время выполнения, когда вы знаете, если ваша программа использует double или float (я надеюсь!), Вы поймете, что из, а затем выполнить эту версию Program «s static void main(), основная точка входа в вашем template d программы.

Теперь, не все могут существовать в этом Programtemplate, как вы можете делать разные вещи в классе, чем за ее пределами: точка Program является дублировать основной поток кода и ваше «глобальное состояние» в одном месте ,

Program может использовать другие template s, как функции или черты или другие подобные коллекции данных static. Он может даже вызывать функции и выполнять перегрузочное разрешение на основе соответствующего типа.

Если вы можете выделить, какие части вашего Program действительно должны знать, что такое Float, это может сэкономить вам много горя. Я бы сделал это только для относительно простой программы.

0

Другой вариант - использовать союз. Объединение позволит использовать одну и ту же память как int, так и double.

union DoubleOrInt 
{ 
    double dValue; 
    int iValue; 
}; 

struct Cstruct 
{ 
    DoubleOrInt var1; 
    DoubleOrInt var2; 
}; 

Доступ к памяти в Cstruct, когда вы знаете, типа он должен быть:

Cstruct Test; 
Test.var1.iValue = 1; 
Test.var2.dValue = 2.0; 

Просто заметьте этот метод будет тратить 4 байта на союз, если вы в конечном итоге с помощью целых чисел вместо двойников (если ваши внутренние и двойные переменные имеют стандартный размер 4 и 8 соответственно).

+0

это похоже на приятное решение, но в моей первоначальной проблеме (я разместил упрощенную версию), где Cstruct.var1 и Cstruct.var1 в свою очередь являются шаблонами (двойными или int). – user1612986

Смежные вопросы