我整个早上都遇到过这个问题而没有任何结果.基本上,我需要一个简单的元编程事物,如果传递的参数是一种std :: vector,我可以分支到不同的特化.
某种类型的is_base_of用于模板.
这样的事情存在吗 ?
我想检查一个类是否是另一个的模板专用化。我试过的是:
template <class T, template <class...> class Template>
struct is_specialization : std::false_type {};
template <template <class...> class Template, class... Args>
struct is_specialization<Template<Args...>, Template> : std::true_type {};
Run Code Online (Sandbox Code Playgroud)
当所有模板参数都是类型实参,但不是某些非类型实参时,它可以正常工作。例如,它可以使用std::vector但不能使用std::array(因为后者接受一个非类型参数std::size_t)。
在编译时进行检查很重要。同样,该解决方案必须适用于任何模板,而不仅仅是矢量或数组。这意味着它可以是任意数量的类型参数和任意数量的非类型参数。例如,它应该与template <class A, bool B, class C, int D, class... Args> class foo;
我想检查两种类型是否相同,但不管它们的模板参数如何.像这样的东西:
template<class T>
class A {};
class B {};
int main() {
cout << std::is_same_template<A<int>, A<string>>::value << endl; // true
cout << std::is_same_template<A<int>, B>::value << endl; // false
}
Run Code Online (Sandbox Code Playgroud)
我知道std::is_same检查两种类型是否匹配.
我需要这个的原因:我有一个可以用任何类型调用的模板化方法,但我想禁止使用类型调用A(模板化),可能使用a static_assert.是A不是模板,我相信它可以很容易地使用来完成std::is_same,但现在,我有一个问题...
编辑:我可以手动排除A为几个常见的Ts,使用,我正在寻找一种方法来做所有T:
static_assert(!std::is_same<parameter_type, A<int>>::value, "Cannot use this function with type A<T>");
static_assert(!std::is_same<parameter_type, A<double>>::value, "Cannot use this function with type A<T>");
static_assert(!std::is_same<parameter_type, A<bool>>::value, "Cannot use this function with type A<T>");
Run Code Online (Sandbox Code Playgroud) 是否可以动态标识最接近的公共层次结构或两个或多个未知类型对象的继承?换句话说,我想测试例如Integer和String是否具有相同的层次结构,而又不知道由于用户的选择我正在测试的对象将是Integer和String。我发现发布了一个C ++问题,看起来与这里的问题类似:检查两种类型是否具有相同的模板 但是,我不熟悉在那里发布的答案的任何VB.net等效项,并且在线翻译人员在出现以下错误时会提供错误提示:我试图翻译它们。那么首先在VB.net中甚至有可能吗?
我所知道的最接近此操作的是.IsAssignableFrom()函数,但就我而言,我不知道首先要对父类/接口/进行什么测试。以上功能是我进行任何搜索时都弹出的与此问题甚至是远程相关的唯一内容。
我需要的上下文在Revit API中;我正在尝试查看用户选择的元素是否具有类似于“对象类型”的类似层次结构/继承关系,如果可以,则允许执行操作,否则,给出警告对话框。
编辑:由于Revit API的性质和命令的预期效果,我插件的用户可以在模型中选择任何内容,而我无法确定我可能要寻找的许多共同祖先使用IsAssignableFrom比较。我可以测试Element类型的(我认为是通用的)通用祖先,但是如果您选择一堵墙和一个element标签,我不想允许用户运行该命令。我需要找到用户选择的元素的公共祖先,并确认最接近的公共祖先在层次结构中的Element类型下。
例如,API中的room tag元素具有类似这样的层次结构:
Object -> Element -> SpatialElementTag -> RoomTag
可能会有更多的中间继承,但是我不会在API文档中进行跟踪。然后每个元素的祖先可能会略有不同。如果我知道我想测试的基础血统,IsAssignableFrom将会很棒。
TnTinMn的答案为我提供了所需的解决方案类型。