gpt4 book ai didi

C++:如果用户试图在没有实例化相应函数模板的情况下实例化类模板,则会生成编译错误

转载 作者:行者123 更新时间:2023-11-30 04:18:23 25 4
gpt4 key购买 nike

在我正在编写的库中,我有一个类:

template<typename T>
class my_class {};

和一个函数:

template<typename T>
void my_function(...) {};

我想保证我的代码的用户调用了 my_function<T>如果他们尝试实例化 my_class<T>,则在他们代码的某处.换句话说,如果他们试图实例化 my_class,我想生成一个编译错误。没有实例化相应的模板 my_function模板。

例子:

int main() {
my_func<int>() // cause instantiation of my_func<int>

my_class<int> foo; // okay, because my_func<int> exists
my_class<char> bar; // compile error! my_func<char> does not exist
}

请注意 my_class<T>不需要使用 my_func<T>在内部所以实例化它不会自动导致 my_func<T>成为实例化。

编辑[0]:​​我无法调用my_func<T>我自己,因为我需要用户调用它并传递信息告诉图书馆如何处理 my_class<T> . IE。如果他们想使用 my_class<char>他们需要在代码的特定位置明确说明。我可以做 my_class<T>构造函数测试是否my_func<T>已被称为生成运行时错误(如果没有),但我更希望能够生成编译时错误,因为在编译时可知是否 my_func<T>曾经使用过。

编辑[1]:一种不太理想的方法是制作 MY_FUNC为一个不完整的模板类创建模板特化的宏...

template<typename T>
class incomplete;

#define MY_FUNC(T) template<> incomplete<T> { static const bool x = my_func<T>(); };

template<typename T>
class my_class {
template<size_t i>
class empty {};

typedef empty<sizeof(incomplete<T>)> break_everything;
}

现在用户只能使用my_class<T>如果MY_FUNC(T)在某处使用。但是,我更喜欢不使用宏且不强制用户使用 MY_FUNC 的解决方案。在全局范围内而不是在函数中。

编辑[2]:感谢大家的回答。我意识到在编译时无法保证用户不会调用 my_func<T>不正确。但我可以让它不太可能发生,并在它们发生时尽早生成运行时错误。

他们应该定义一个函数,比方说,initialise_library .该函数如下所示:

void initialise_library() {
my_func<int>();
my_func<char>();
etc..
}

在库初始化期间,它会检查以确保没有 my_func已被调用。然后调用 initialise_library .然后它检查以确保所有 my_funcs已被调用。这是可行的。如果用户没有定义 initialise_library他们收到链接器错误。如果他们没有调用 my_func<T>在他们的程序中某处为 my_class<T>他们使用然后(理想情况下)他们得到一个编译错误。如果他们定义了 initialise_library 并且他们使用了my_func<T>在某处但是他们在错误的地方使用了它,他们在程序启动时遇到运行时错误。

基本上我想阻止他们添加 my_class<T>在他们的代码中的某处忘记输入 my_func<T>()initialise_library ,因为这是他们可能会做的事情。运行时检查的唯一方法是在 my_class<T> 的构造期间.如果他们只使用 my_class<T>,这将是一个恼人的延迟时间来进行此检查在一个很深且很少使用的代码块中。

最佳答案

即使可以在编译时检测到对您的函数的调用,也完全不可能验证该调用实际上是在运行时进行的,并且它发生在其他调用之前。因此无论如何您都必须使用运行时检查。

关于C++:如果用户试图在没有实例化相应函数模板的情况下实例化类模板,则会生成编译错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16454987/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com