string-int[] array

Dennis Ritchie via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Sun Mar 8 12:04:17 PDT 2015


On Sunday, 8 March 2015 at 18:54:43 UTC, Meta wrote:
> On Sunday, 8 March 2015 at 18:38:02 UTC, Dennis Ritchie wrote:
>> On Sunday, 8 March 2015 at 18:18:15 UTC, Baz wrote:
>>> import std.stdio;
>>> import std.typecons;
>>>
>>> alias T = Tuple!(string, int);
>>>
>>> void main(string[] args)
>>> {
>>>   T[] tarr;
>>>   tarr ~= T("a",65);
>>>   tarr ~= T("b",66);
>>>   writeln(tarr);
>>> }
>>> ----
>>>
>>>> [Tuple!(string, int)("a", 65), Tuple!(string, int)("b", 66)]
>>
>> Thanks, will do.
>
> It might be better to use std.variant.Algebraic. An array of 
> tuples is wasteful of memory as you only need one or the other.
>
> import std.variant;
>
> alias IntOrStr = Algebraic!(int, string);
>
> IntOrStr[] makeIntOrStrArray(T...)(T vals)
> {
> 	import std.algorithm;
> 	import std.array;
> 	
> 	auto result = new IntOrStr[](T.length);
> 	foreach (i, val; vals)
> 	{
> 		result[i] = IntOrStr(val);
> 	}
> 	
> 	return result;
> }
>
> void main()
> {
> 	IntOrStr[] arr = makeIntOrStrArray(4, "five");
> }

Thanks.

On Sunday, 8 March 2015 at 18:57:38 UTC, Kagamin wrote:
> http://dpaste.dzfl.pl/2c8d4a7d9ef0 like this.
>struct IntString
>{
>	string svalue;
>	this(string s){ svalue=s; }
>	this(int i){ ivalue=i; }
>	int ivalue() const
>	{
>		assert(svalue.length==0);
>		return cast(int)svalue.ptr;
>	}
>	void ivalue(int i)
>	{
>		svalue=cast(string)(cast(char*)0)[i..i];
>	}
>}
>
>int main()
>{
>	auto s=IntString(5);
>	assert(s.ivalue==5);
>	s.ivalue=-6;
>	assert(s.ivalue==-6);
>	return 0;
>}

Thanks.


More information about the Digitalmars-d-learn mailing list