template metafunction for detecting template specialisations

放肆的年华 提交于 2019-12-01 01:46:04

问题


Inspired by this question, i'm wondering if there is some compile-time check one can introduce to detect if two given template instantiations:

template <typename T>
class Templ...

typedef Templ<std::string> stringInstance;
typedef Templ<double> doubleInstance;

are constructed from the same definition, or if they are built from different specializations of the Templ template

so basically the hypothetical template function will behave like this:

template <typename T>
class Templ
{}

template <>
class Templ<std::string>
{}

template <>
class Templ<double>
{}

template <typename T1,typename T2>
class Belong_To_Same_Templ_Definition
{}

//tests
typedef Templ<std::string> stringInstance;
typedef Templ<double> doubleInstance;
typedef Templ<int> intInstance;
typedef Templ<char> charInstance;

assert( Belong_To_Same_Templ_Definition< intInstance , charInstance >::value == true);
assert( Belong_To_Same_Templ_Definition< intInstance , doubleInstance >::value == false);
assert( Belong_To_Same_Templ_Definition< stringInstance , doubleInstance >::value == false);

is possible to create this kind of metafunction?


回答1:


It seems unlikely, to be honest (although I can't definitively rule out a cunning trick).

There is no first-class identity for a given specialization (outside the type arguments that select it), to compare.

So, you could make it work with your own templates, if you want, but you can't write an ad-hoc inference for existing templates.

Consider also that it wouldn't work anyway, in the sense that it couldn't tell whether two instantiations have a compatible layout: even if Templ<int> and Templ<char> are instantiated from the same template code, with no specialization, that code can use traits classes which are specialied.



来源:https://stackoverflow.com/questions/14244082/template-metafunction-for-detecting-template-specialisations

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!