我有很多的班级,不同的成员,所有这一切有我,询问如何建立通用模板来执行这些操作如下类型C++模板变量类型声明
::basedata::Maindata maindata;
::basedata::Subdata subinfo("This goes into the subinfo vector");
subinfo.contexts(contextInfo);
maindata.subdata().push_back(subinfo);
注意的操作。我无法为每种类型的maindata和subinfo设置一个特例。我也需要能够看到如何从我的主代码中调用模板。如果 maindata.subdata()存在,但我一直能够建立一个模板,但如果它不存在,则在对该模板的调用中保持编译失败。那就是创建表格的模板
perform_Push(maindata.subdata(), subinfo);
这样就可以编译maindata.subdata()是否存在。
我可以接受,建立模板,使主代码可以显示
bool retval
retval = hasmember(maindata, subdata);
if (retval)
{
buildmember(maindata.subdata, subinfo);
setAttributes(subinfo, data);
perform_Push(maindata.subdata(), subinfo)
}
else
{
// Perform alternate processing
}
截至目前,内如果不编译代码时被调用模板应该仅仅是无效的。
While :: basedata :: Maindata总是被定义的,:: basesata :: Subdata可能会或可能不会被定义,这取决于我的代码正在使用的库的版本。子数据被定义为属于maindata的矢量,因此它具有定义的push_back()操作。在任何情况下,都有太多类型的subData为模板中的每个类型创建一个单独的模板作为T :: Subdata。
也就是说,如果子数据是唯一的情况下,我可以创建模板T的专业化为:: maindata ::子数据和通用模板T.
我没有包含文件的任何控制或库,这样我就不能创建一个变量的#define来用预编译器进行测试。有没有一种设置模板的好方法,可以让它起作用?我可以使用返回布尔型true(成功)或false(无此类定义)的模板,并在运行时调用备用处理。我不需要有替代模板。
基本上,我问的是如何将SFINAE应用于这种特殊情况。
我设法找出我需要做的设置基本模板
如果我有最基本的操作
maindata.subdata().push_back(data)
我可以定义表单模板,
<template class T, typename D>
auto doPush(D data) -> decltype(T.pushback(data), void())
{
T.push_back(data);
}
和通话将
doPush<maindata.subdata()>(data);
但是,问题将是如何设置时,maindata还没有成员的子数据。
看一看型性状和SFINAE – OMGtechy 2015-02-23 18:36:36
我不知道你问:也许http://stackoverflow.com/questions/18701798/building-and-accessing-a-list-of -types-at-compile-time/18704609#18704609 – 2015-02-23 18:43:49
@DieterLücking我会看看问题和答案,看看它是否可以提供帮助。 – sabbahillel 2015-02-23 18:55:38