gpt4 book ai didi

c++ - 没有辅助类型的依赖类型

转载 作者:行者123 更新时间:2023-12-05 09:27:19 24 4
gpt4 key购买 nike

给定typename Tint N , 下面的模板值生成一个类型为空的函数指针:

int (*) (T_0, ..., T_N)

虽然代码有效,但我不喜欢它用 Temp 污染命名空间。 Bootstrap 助手 - Temp是必需的,因为类型不能括在括号中。例如,以下均无效。

(int (*)((int))
((int (*)(int)))
(int (*)( (I,T)... ))

最后一个条目显示了我想如何扩展 T进入列表 N T s - 这当然是无效的。这是制作 T 的技巧取决于 I但只有 T 的值, 感谢逗号运算符。

作为解决方法,我不得不创建一次性类型 Temp模板制作T取决于 int ,或者在这种情况下,I .它的用法为 Temp<T,I>是有效的,因为它没有将类型括在括号中。

但是,就像我说的,我想摆脱 Temp因为它污染了命名空间。在下面的代码中,我重申了问题并演示了一些尝试的解决方法,遗憾的是,所有这些都失败了。作为记录,我认为 template <typename T, int> using Temp = T; 之间是等价的和 template <... template<typename T1, int N1> typename Temp=T>应该允许。

跟进:当我最初发布这个问题时,我并不知道为什么不允许使用额外的括号,而且我仍然不确定为什么我的一些尝试失败了。例如:

decltype(w<T,N>())...
result_of<w<T,N>()>::type...

我没有看到类型周围有任何括号!


#include <iostream>
#include <typeinfo>


// Problem, #1
// This is a one-shot helper than pollutes the namespace
template <typename T, int>
using Temp = T;

// Idea #1
// Make the one-shot helper actuall useful, where ... represents either
// type or non-type parameters.
// Result
// Not possible.
//template <typename T, ...>
//using Dependent = T;

// Idea #2
// Make the types dependent within the template declaration
// Result
// Probably not possible
//template <typename T, int N, template<typename T1, int N1> typename F=T>

// Idea #6
// Replace the lambda with a struct (not shown)
// Result
// Crashes gcc
template <typename T, int N>
auto a =
[]<size_t... I>
(std::index_sequence<I...>) {
// Problem #2
// Function type declaration won't parse with extra parentheses
//return (int (*)( (I,T)... ))nullptr;

// Idea #3
// Move the templated helper into the function
// Result
// Not possible
//template <typename T, int>
//using Temp = T;

// Idea #4
// Replace the templated helper with a templated lambda which *is*
// allowed inside functions.
// Result
// Still requires parentheses, still breaks function type declaration
//auto w = []<typename T1, int N1>() -> T1 {};
//return (int (*)( decltype(w<T,N>())... ));

// Idea #5
// result_of (which is a template) instead of decltype
// Result
// Doesn't work even without parentheses, not sure why
//return (int (*)( result_of<w<T,N>>... ));
//return (int (*)( result_of<w<T,N>()>::type... ));

// Idea #7
// Use std::function
// Result
// Can't get function pointer from std::function

// Idea #2 implementation
//using F<T,I> = T;
//return (int (*)( F<T,I>... ))nullptr;

// So far, only this works:
return (int (*)( Temp<T,I>... ))nullptr;
}
(std::make_index_sequence<N>{});

int main () {
auto b = a<int, 4>;
std::cout << typeid(b).name() << std::endl;
}

最佳答案

你可以替换Temp<T,I>std::enable_if_t<(void(I), true), T> .


Function type declarations won't parse extra parentheses

that actually works! Why?

类型不能括在括号中。但是 enable_if_t 的第一个参数是表达式而不是类型,所以 ( )那里是允许的。

关于c++ - 没有辅助类型的依赖类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72579592/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com