LINUX.ORG.RU

игнорирование компилятором выражения с несуществующим полем структуры

 ,


0

1

Сабж. У меня сейчас зоопарк из версий алгоритма, в некоторых версиях юзается некое поле структуры (напр. float d_theta;), в других оно нафик не нужно (и в хидере его нет).

Когда она юзается, оно юзается в двух модулях (не считая хидера). Как бы мне легким движением выключать соотв. код не заморачиваясь с версионированием и директивами условной компиляции?

Скажем если я это поле закмментил в хидере, то при компиляции gcc сам проигнорит соотв. код в модулях.

Бродят в голове извращения со SFINAE, но может че из коробки есть?;-)

★★★★★

извращения со SFINAE

This. А как из коробки? Это как раз-таки сам SFINAE в чистом виде.

template <typename T, typename = decltype(T::field)>
return-type name (argument-list) { /* */ }

template <typename T>
return-type name (argument-list) { /* */ }
intelfx ★★★★★
()

в других оно нафик не нужно (и в хидере его нет)

Может, есть смысл сделать два типа структуры: один с этим полем, второй — без него. И специализировать алгоритмы по этим типам.

one_more_hokum ★★★
()

Грубый вариант с ходу (на C++11):

#include <iostream>
#include <type_traits>

template< typename S >
class has_d_theta
	{
	private :
		template< typename P, P > struct checker;

		template< typename D > static std::true_type test(
				checker< decltype(&D::d_theta), &D::d_theta> * );

		template< typename D > static std::false_type test(...);

	public :
		enum { value =
			std::is_same< std::true_type, decltype(test<S>(0)) >::value };
	};

struct data_with_d_theta
	{
		int d_alpha = 0;
		float d_beta = 0;
		double d_theta = 0;
	};

struct data_without_d_theta
	{
		int d_alpha = 0;
		float d_beta = 0;
	};

template< typename S >
typename std::enable_if< has_d_theta<S>::value >::type
show_value( const S & s )
	{
		std::cout << "alpha: " << s.d_alpha
				<< ", beta: " << s.d_beta
				<< ", theta: " << s.d_theta
				<< std::endl;
	}

template< typename S >
typename std::enable_if< !has_d_theta<S>::value >::type
show_value( const S & s )
	{
		std::cout << "alpha: " << s.d_alpha
				<< ", beta: " << s.d_beta
				<< std::endl;
	}

int main()
	{
		show_value( data_with_d_theta{} );
		show_value( data_without_d_theta{} );
	}

Продробнее про std::enable_if, пример можно посмотреть здесь.

eao197 ★★★★★
()
Ответ на: комментарий от AIv

С чего бы вдруг? Директивы условной компиляции надо будет расставлять везде, где используются эти алгоритмы, а в случае их специализации — поправил typedef в одном заголовочном файле, и везде всё стало работать по требуемому варианту.

one_more_hokum ★★★
()
Ответ на: комментарий от eao197

И кто-то после этого будет говорить, что C++ не уродливое, неудобное поделие. Ждем концептов в 2017.

anonymous
()
Ответ на: комментарий от anonymous

И кто-то после этого будет говорить, что C++ не уродливое, неудобное поделие.

Ну покажите тогда, как такая же проблема решается в любом другом мейнстримовом языке программирования со статической типизацией... Хотя таковых всего-то два штуки: Java и C#.

eao197 ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.