On Saturday, 18 March 2017 at 15:30:27 UTC, Hussien wrote:
On Saturday, 18 March 2017 at 15:16:35 UTC, Basile B. wrote:
On Saturday, 18 March 2017 at 13:30:22 UTC, Hussien wrote:
On Saturday, 18 March 2017 at 13:16:49 UTC, Adam D. Ruppe
wrote:
On Saturday, 18 March 2017 at 13:06:56 UTC, Hussien wrote:
So you are telling me there is no way to do this easily?
What are you actually trying to do?
Glad you asked! It is very simple: I am trying to get the
underlying D type from a type that I have.
interface X; => dtype!(X) == "interface"
enum X; => dtype!(X) == "enum"
class X; => dtype!(X) == "class"
struct X; => dtype!(X) == "struct"
union X; => dtype!(X) == "union"
wchar* X; => dtype!(X) == "wchar*"
int X; => dtype!(X) == "int"
void function() X; => dtype!(X) == "function*"
void X(); => dtype!(X) == "function"
etc..
etc..
The very right terms should only be terms that are listed in
the D grammar as types besides the *'s. If a type is a
pointer to a _type_, dtype should return _type_*, etc.
The problem with enums is that it contains several stuff. It's
actually a storage class. enums can be
- named enum
- anonymous enum
- manifest constant
- lambda
- templates
The others stuff are easy to retrieve, like you've been said
earlier.
I'm just going to use what Mike Parker suggested. I'll fill in
the types I need as necessary. Luckily I do not need to many
and I will tweak for my needs. I was hoping for a general
solution. I simply need some way to pass around the base type
in a string since I cannot pass a generic arbitrary type.
obviously a lambda would return "lambda", a template should
return template, etc.
Manifest constant could return "manifest constant". I don't
care about the exact value as long as I can pass it around and
use it and there is always a one to one correspondence.
For manifest constants this should work:
```
/**
* Indicates wether something is a value known at compile time.
*
* Params:
* V = The value to test.
* T = Optional, the expected value type.
*/
template isCompileTimeValue(alias V, T...)
if (T.length == 0 || (T.length == 1 && is(T[0])))
{
enum isKnown = is(typeof((){enum v = V;}));
static if (!T.length)
enum isCompileTimeValue = isKnown;
else
enum isCompileTimeValue = isKnown && is(typeof(V) ==
T[0]);
}
///
unittest
{
string a;
enum b = "0";
enum c = 0;
static assert(!isCompileTimeValue!a);
static assert(isCompileTimeValue!b);
static assert(isCompileTimeValue!c);
static assert(isCompileTimeValue!(b,string));
static assert(isCompileTimeValue!(c,int));
static assert(!isCompileTimeValue!(c,char));
static assert(!isCompileTimeValue!(char));
}
/// ditto
template isCompileTimeValue(V, T...)
if (T.length == 0 || (T.length == 1 && is(T[0])))
{
enum isCompileTimeValue = false;
}
```