我有一个里面有静态字段的库.我想创建一个应用程序并引用这个库,所以我有两个这个静态字段的实例..Net运行时不允许两次引用同一个库,但我想知道是否有可能克服这个限制?
我不允许更改库,但我可以复制/重命名它.
鉴于以下内容:
template<typename T>
class A
{
public:
static const unsigned int ID = ?;
};
Run Code Online (Sandbox Code Playgroud)
我希望ID为每个T生成一个唯一的编译时间ID.我考虑过__COUNTER__并且增强PP库但到目前为止都没有成功.我怎样才能做到这一点?
编辑:ID必须可用作switch语句中的大小写
Edit2:基于静态方法或成员地址的所有答案都不正确.尽管它们确实创建了唯一的ID,但它们在编译时未得到解析,因此不能用作switch语句的情况.
我想在编译时使用类型的名称.例如,假设我写了:
constexpr size_t my_strlen(const char* s)
{
const char* cp = s;
while(*cp != '\0') { cp++; };
return cp - s;
}
Run Code Online (Sandbox Code Playgroud)
现在我希望:
template <typename T>
constexpr auto type_name_length = my_strlen(typeid(T).name());
Run Code Online (Sandbox Code Playgroud)
但是,唉,typeid(T).name()只是const char*,而不是constexpr ......还有其他一些constexpr方法来获得一个类型的名字吗?
我希望以下程序一直返回0.但是,对于Visual Studio 2013(Update 4),程序在发布版本中退出1.我不确定这是一个错误,还是编译器的优化器是正确的,并且依赖于某些边缘行为.如果关闭CONST宏,则release exe返回0.如果优化器确实正确,我是否可以获得允许它发出代码的原因?
#if 1
# define CONST const
#else
# define CONST
#endif
class TypeId {
public:
bool operator== (TypeId const & other) const
{
return id == other.id;
}
private:
TypeId (void const * id)
: id(id)
{}
public:
template <typename T>
static TypeId Get ()
{
static char CONST uniqueMemLoc = 0;
return TypeId(&uniqueMemLoc);
}
private:
void const * id;
};
int main(int, char **)
{
typedef int A;
typedef unsigned int B;
if (TypeId::Get<A>() …Run Code Online (Sandbox Code Playgroud) 假设我有一个功能
void myFun(int*) Run Code Online (Sandbox Code Playgroud) 在C++中,以下是什么意思
( void(*)(void*) )&myFun
Run Code Online (Sandbox Code Playgroud)
它是一个指向函数的指针,它接受一个(void*)参数并返回一个void?允许这种类型的演员吗?
c++ ×4
.net ×1
c# ×1
c++11 ×1
c++14 ×1
compile-time ×1
constexpr ×1
optimization ×1
reflection ×1
templates ×1