Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++11 构建constexpr模板结构(C+;+;11)_C++11_Templates_Variadic Templates_Constexpr - Fatal编程技术网

C++11 构建constexpr模板结构(C+;+;11)

C++11 构建constexpr模板结构(C+;+;11),c++11,templates,variadic-templates,constexpr,C++11,Templates,Variadic Templates,Constexpr,我有这个代码,它是有效的。。。到目前为止一切顺利: struct _TYPEIDSTR {}; typedef _TYPEIDSTR *TYPE_ID; template<class T> _TYPEIDSTR _TYPE_ID; template<class T> constexpr TYPE_ID getTypeID() { return &_TYPE_ID<T>; } 像这样打电话: constexpr TYPE_ID id1 = getTy

我有这个代码,它是有效的。。。到目前为止一切顺利:

struct _TYPEIDSTR {};
typedef _TYPEIDSTR *TYPE_ID;
template<class T> _TYPEIDSTR _TYPE_ID;

template<class T> constexpr TYPE_ID getTypeID() { return &_TYPE_ID<T>; }
像这样打电话:

constexpr TYPE_ID id1 = getTypeID<int>();
constexpr TYPE_ID id2 = getTypeID<int>();
RLOG("ID1 : " << id1);
RLOG("ID2 : " << id2);
constexpr auto x = getOverlayInfo(pippo); <<--- ERROR2

constexpr auto x=getOverlayInfo(pippo) 不知道你想做什么

无论如何,如果您想使用C++11(并避免使用C++14或更高版本),就不能使用像这样的模板变量

template<class T> _TYPEIDSTR _TYPE_ID;
您可以获取
constexpr
值,并检查它们是否存在差异

constexpr auto const idInt = typeId<int>::getId();
constexpr auto const idLong = typeId<long>::getId();

std::cout << (idInt != idLong) << std::endl; // print 1
并且,使用前面的
typeId
,从不同的函数中获得不同的
constexpr
值,如下所示

template <typename Ft, Ft f>
struct funcT
 { };
int  foo (int) { return 0; }
int  bar (int) { return 0; }
long baz (int, long, long long) { return 0L; }

// ...

constexpr auto idFoo = typeId<funcT<decltype(&foo), &foo>>::getId();
constexpr auto idBar = typeId<funcT<decltype(&bar), &bar>>::getId();
constexpr auto idBaz = typeId<funcT<decltype(&baz), &baz>>::getId();

std::cout << (idFoo != idBar) << std::endl; // print 1
std::cout << (idFoo != idBaz) << std::endl; // print 1
intfoo(int){返回0;}
int条(int){返回0;}
longbaz(int,long,long-long){return0l;}
// ...
constexpr auto-idFoo=typeId::getId();
constexpr auto-idBar=typeId::getId();
constexpr auto-idBaz=typeId::getId();

std::cout模板变量(
\u TYPE\u ID
)是C++14的一个特性;你接受C++14的答案吗?嗯。。。我正在C++14上测试,但它应该在C++11上运行。但是如果值得的话,我可以尝试用更新的GCC为我的微控制器重建工具链。我需要尽可能多的内存,因此我需要在编译时将这些信息保存在闪存中。不确定是否理解:您是否需要引用类型或(取决于
pippo
)的堆时标识符对象?我将尝试更好地解释:如果您使用不同的函数初始化它,您是否希望从
\u GlobalOverlayInfo
中获得相同的标识符,或者希望从使用
pippo()
pluto()
初始化的对象中获得不同的标识符?返回临时对象的地址在实践中没有多大意义。我认为它还正式阻止了在编译时对
constexpr
函数进行实际计算。您可能希望按值返回
\u GlobalOverlayInfo
。退一步说,不清楚为什么您认为在编译时需要
\u GlobalOverlayInfo
;您应该能够通过类型特征和类似的元编程技术获得所需的一切。似乎您正在尝试实现某种形式的运行时类型信息(RTTI)——但是您坚持使用
constepr
令人费解。我喜欢您的想法,它提供了
getId
功能的外部
funcT
。我想这种方法可以扩展到两种情况:类型和函数。这样,就不需要修改所有类型(这可能是不可能的)。为了澄清这一点,我需要在程序内存中创建一个结构(在我的例子中是Flash),其中包含一些关于函数参数和返回值的信息,一个带地址的函数指针和一些其他次要内容。我已经有了它,但是在RAM中,这对我来说不是最佳的,最终的结果是有一个这样调用的模板:
Func(“name”,function)
将返回这样一个结构的指针,它将与“name”指针一起存储在数组中(这次是在运行时的RAM中)。除了一种在编译时将结构放入闪存的方法外,所有这些都在工作。
constexpr auto const idInt = typeId<int>::getId();
constexpr auto const idLong = typeId<long>::getId();

std::cout << (idInt != idLong) << std::endl; // print 1
template <typename Ft, Ft f>
struct funcT
 { };
int  foo (int) { return 0; }
int  bar (int) { return 0; }
long baz (int, long, long long) { return 0L; }

// ...

constexpr auto idFoo = typeId<funcT<decltype(&foo), &foo>>::getId();
constexpr auto idBar = typeId<funcT<decltype(&bar), &bar>>::getId();
constexpr auto idBaz = typeId<funcT<decltype(&baz), &baz>>::getId();

std::cout << (idFoo != idBar) << std::endl; // print 1
std::cout << (idFoo != idBaz) << std::endl; // print 1