【发布时间】:2019-07-12 08:23:36
【问题描述】:
我无法理解以下问题。我什至真的不知道我该如何接近它。
考虑这段代码:
struct fragment_shader {
std::string mPath;
};
struct vertex_shader {
std::string mPath;
};
template <typename T>
T shader(std::string path) {
return T{ path };
}
要创建不同的结构,我可以编写以下内容:
auto fragmentShader = shader<vertex_shader>("some_shader.frag");
auto vertexShader = shader<fragment_shader>("some_shader.vert");
我想知道,是否可以让编译器根据传递给shader 函数的path 参数找出类型,所以我只需要写:
auto fragmentShader = shader("some_shader.frag");
auto vertexShader = shader("some_shader.vert");
由于文件以“.frag”结尾,类型fragment_shader会被推断出来,而对于以“.vert”结尾的路径,vertex_shader会被推断出来。
这可能吗?
我在enable_if 上阅读了一些内容,但实际上我不知道如何使用它来实现我想要实现的目标。我会尝试以下方法:
template<>
typename std::enable_if<path.endsWith(".frag"), fragment_shader>::type shader(std::string path) {
return fragment_shader{ path };
}
template<>
typename std::enable_if<path.endsWith(".vert"), vertex_shader>::type shader(std::string path) {
return vertex_shader{ path };
}
但显然,这不会编译。这只是为了说明我想要做什么。
【问题讨论】:
-
模板不可能,因为它只是编译时的事情,字符串的内容只有在运行时才知道。但是,您可以使用标准工厂模式,其中函数返回一个指向公共基类的指针,并在运行时检查后缀以创建适当的对象。
-
路径在编译时都知道吗?如果是,可能有一个解决方案……如果不是,它不能像这样工作,因为类型需要在编译时知道,因此不能仅依赖于运行时已知的东西。
-
可以对编译时已知的路径进行重载。所以为了这个问题:让我们假设所有路径在编译时都是已知的。
-
问题是即使是文字字符串在编译时也不知道,或者更确切地说,它们的 位置 是不知道的。这就是为什么你也不能使用指向它们的指针。文字字符串常量数组的位置只有在 link 时才知道。
-
@Someprogrammerdude 结果表明字符串文字在编译时是未知的,但显然具有静态链接的 char 数组是已知的。看我的回答。
标签: c++ c++17 sfinae enable-if