"Error: `TypeInfo` cannot be used with -betterC" on a CTFE function
Liam McGillivray
yoshi.pit.link.mario at gmail.com
Fri Apr 12 00:04:48 UTC 2024
On Tuesday, 9 April 2024 at 12:45:55 UTC, Richard (Rikki) Andrew
Cattermole wrote:
>
> On 09/04/2024 12:48 PM, Liam McGillivray wrote:
>
>> I suppose this was a good new thing to learn, though I'm still
>> quite far from being able to construct a function from another
>> function using a template.
>>
>> I suppose that if I wanted it to make a function from another
>> function, I may be able to do it in a template using some
>> `static foreach` to make arrays of function parameters, and
>> then combine them together without the use of strings, instead
>> using placeholders (aliases or whatever they'd be called) and
>> maybe the `tupleof` function. Am I headed in the right
>> direction (if you can understand my weak attempt to describe
>> the direction I'm thinking of going in)?
>
> ``tupleof`` isn't a function, its a property to get a "tuple" a
> sequence of fields for a struct/class.
>
> However most likely you'd have to resort to string mixins if
> you're messing about with parameters like I think? you are
> asking for.
>
> I'm not entirely sure what you're wanting there.
Here's what I wanted to do.
In the library I'm working on, there are various declarations for
functions defined in an external C library following the line
`extern (C) @nogc nothrow:`. Here are some examples of such
declarations which have a `const(char)*` parameter:
```
void InitWindow(int width, int height, const(char)* title);
void SetWindowTitle(const(char)* title);
Shader LoadShader(const(char)* vsFileName, const(char)*
fsFileName);
```
I wanted to generate definitions of overloads of these functions
using strings as parameters instead of `const(char)*`. For the
`InitWindow` function shown above, the overload should be defined
like this:
```
void InitWindow(int width, int height, ref string title) {
InitWindow(width, height, cast(const(char)*)title);
}
```
or alternatively, like the following:
```
void InitWindow(int width, int height, string title) {
InitWindow(width, height, title.toStringz);
}
```
I'm not sure which of these is better, thought the latter one
would need to be modified to not accept string literals. I found
that the former one has the advantage that making the `title`
parameter `ref string` means that string literals use the
existing version of the function. I know that the former can be
`@nogc`, unlike the latter, though I don't know if there is any
advantage offered by `toStringz` over `cast(const(char)*)`.
But anyway, my goal was to generate function overloads like
either of the above. I have already posted a version of a CTFE
function that does this, though I put them under `version
(D_TypeInfo)` so that they aren't available in `betterC` builds,
since the function I wrote doesn't build with `betterC`.
More information about the Digitalmars-d-learn
mailing list